android 屏幕适配方案

适配原因

原生渲染前会将dp转为px,dpi就是导致差异化因素也叫像素密度,根据设备分辨率和尺寸计算得出,出厂时已经决定了
density = dpi / 160
px = dp * density


在这里插入图片描述
适配方案

1.dimens基于px适配(宽高限定符适配)

在res文件中,定义不同分辨率px参数,例如values-480*320 ,但是这种方案由于手机分辨率太多,局限性太高,弃用。

2.dimens基于dp适配(smallestWidth适配)

这种是根据最小宽度限定符,android会识别屏幕可用宽高的最小dp值,然后根据结果去寻找对应限定符的文件夹下的资源文件。
比如没有value-sw360dp 文件夹会向下寻找 value-sw350dp ,这种增加了分辨率匹配的容错率。
但是这种弊端是,会增加多个文件夹,而且也不能完美匹配所有机型

3.今日头条适配

今日头条适配方案是通过修改手机设备密度density完成的,通过修改density值,强行把所有不同尺寸分辨率的手机的宽度dp值改成一个统一的值,这样就解决了所有的适配问题。

https://blog.csdn.net/weixin_34113237/article/details/87991287?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight

/**
     * 适配:修改设备密度
     */
    private static float sNoncompatDensity;
    private static float sNoncompatScaledDensity;
 
    public static void setCustomDensity(@NonNull Activity activity, @NonNull final Application application) {
        DisplayMetrics appDisplayMetrics = application.getResources().getDisplayMetrics();
        if (sNoncompatDensity == 0) {
            sNoncompatDensity = appDisplayMetrics.density;
            sNoncompatScaledDensity = appDisplayMetrics.scaledDensity;
            // 防止系统切换后不起作用
            application.registerComponentCallbacks(new ComponentCallbacks() {
                @Override
                public void onConfigurationChanged(Configuration newConfig) {
                    if (newConfig != null && newConfig.fontScale > 0) {
                        sNoncompatScaledDensity = application.getResources().getDisplayMetrics().scaledDensity;
                    }
                }
 
                @Override
                public void onLowMemory() {
 
                }
            });
        }
        float targetDensity = appDisplayMetrics.widthPixels / 360;
        // 防止字体变小
        float targetScaleDensity = targetDensity * (sNoncompatScaledDensity / sNoncompatDensity);
        int targetDensityDpi = (int) (160 * targetDensity);
 
        appDisplayMetrics.density = targetDensity;
        appDisplayMetrics.scaledDensity = targetScaleDensity;
        appDisplayMetrics.densityDpi = targetDensityDpi;
 
        final DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();
        activityDisplayMetrics.density = targetDensity;
        activityDisplayMetrics.scaledDensity = targetScaleDensity;
        activityDisplayMetrics.densityDpi = targetDensityDpi;
 
    }

官方屏幕适配之ScreenMatch DP适配

Android ScreenMatch屏幕适配是一种简单适用的适配方式,是由Android官方推出的适配方法

1.首先下载安装ScreenMatch插件,Ctrl+Alt+S打开Plugins
image.png
2.下载dimens.xml并存放在values目录下
image.png

dimens.xml下载地址:https://download.csdn.net/download/duanchuanzhi/10544316

3.生成values-sw384dp~values-sw1365dp,生成步骤:

3.1.使用鼠标左键点击任意文件夹


image.png

3.2.点击ok


image.png

3.3.弹出Over, adapt successful提示表示生成成功,继续点击ok
image.png
生成成功之后会在res目录下生成对应文件夹
image.png

因为默认生成的是下列最小宽度dp的dimens.xml文件
384,392,400,410,411,480,533,592,600,640,662,720,768,800,811,820,960,961,1024,1280,1365,如果不需要或者需要增加某些dp值的dimens.xml文件,则需要修改配置文件,即screenMatch.properties文件(修改前先删除之前生成的全部dimens.xml文件)。配置文件在我们执行完成上面的命令后,会在项目的目录下自动生成,如下:


image.png

打开文件,修改需要适配384,392,400,410,411的值,不需要适配480,533,592,600,640,662,720,768,800,811,820,960,961,1024,1280,1365的值


image.png

使用

image.png

你可能感兴趣的:(android 屏幕适配方案)