屏幕适配(三)——修改系统density

从之前的文章我们知道,系统最终会把我们的dp、sp等转换为px来绘图,而转换比例和density、scaledDensity有关,那么,我们可以直接修改系统的density值,来达到自动适配的目的

public class Density {

    private static final float  WIDTH = 1080;//参考设备的宽

    private static float appDensity;//表示屏幕密度
    private static float appScaleDensity; //字体缩放比例,默认appDensity

    public static void setDensity(final Application application, Activity activity){
        //获取当前app的屏幕显示信息
        DisplayMetrics displayMetrics = application.getResources().getDisplayMetrics();
        if (appDensity == 0){
            //初始化赋值操作
            appDensity = displayMetrics.density;
            appScaleDensity = displayMetrics.scaledDensity;
            //添加字体变化监听回调
            application.registerComponentCallbacks(new ComponentCallbacks() {
                @Override
                public void onConfigurationChanged(Configuration newConfig) {
                    //字体发生更改,重新对scaleDensity进行赋值
                    if (newConfig != null && newConfig.fontScale > 0){
                        appScaleDensity = application.getResources().getDisplayMetrics().scaledDensity;
                    }
                }
                @Override
                public void onLowMemory() {

                }
            });
        }
        //计算目标值density, scaleDensity, densityDpi
        float targetDensity = 1;
        if (displayMetrics.widthPixels > displayMetrics.heightPixels) {
            //横屏
            targetDensity = displayMetrics.heightPixels / WIDTH;
        } else {
            targetDensity = displayMetrics.widthPixels / WIDTH;
        }
        float targetScaleDensity = targetDensity * (appScaleDensity / appDensity);
        int targetDensityDpi = (int) (targetDensity * 160);

        //替换Activity的density, scaleDensity, densityDpi
        DisplayMetrics dm = activity.getResources().getDisplayMetrics();
        dm.density = targetDensity;
        dm.scaledDensity = targetScaleDensity;
        dm.densityDpi = targetDensityDpi;
    }

}

首先,通过application.getResources().getDisplayMetrics();获取到系统默认的值,然后通过displayMetrics.widthPixels/WIDTH,得到目标density,这个就是实际屏幕分辨率和基准值比例
布局文件



    
    

然后在Activity的setContentView之前调用Density.setDensity(getApplication(),this);

测试机
机器 尺寸(英寸) widthPixels heightPixels 对角线 计算出的densityDpi densityDpi density
机器D 6 2160 1080 2415 402.5 420 2.625

看下效果


屏幕适配(三)——修改系统density_第1张图片
device-2019-09-20-111242_spec.png

你可能感兴趣的:(屏幕适配(三)——修改系统density)