适配基础

渲染UI前会将dp转成px,相关计算公式:

dip = (宽的平方+高的平方)(px)开根号/屏幕尺寸

density = dip/160

px = density*dp

图片文件:

mdip-像素密度:120~160(dp)      图片大小:48*48(px)

hdip-像素密度:160~240(dp)       图片大小:72*72(px)

xhdip-像素密度:240~320(dp)     图片大小:96*96(px)

xxhdip-像素密度:320*480(dp)    图片大小:144*144(px)

xxxhdip-像素密度:480*640(dp)  图片大小:192*192(px)

比例:2:3:4:6:8

适配方式一(参考资料:https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA):

说明:初始化density和字体的缩放因子

          监听application的系统设置变化,重新修改字体缩放因子

          重新设置设备的density、dpi和scaleDensity

          测试发现设置application下的displayMetrics的属性和app下的displayMetrics的属性是一样的效果

代码如下:

 private static float mNonCompatDisplay;
    private static float mNonCompatScaledDisplay;

    public static void setDisplayMetrics(Activity activity, final Application application, int displayScale) {
        final DisplayMetrics appDisplayMetrics = application.getResources().getDisplayMetrics();
        if (mNonCompatDisplay == 0) {
            mNonCompatDisplay = appDisplayMetrics.density;
            mNonCompatScaledDisplay = appDisplayMetrics.scaledDensity;
            application.registerComponentCallbacks(new ComponentCallbacks() {
                @Override
                public void onConfigurationChanged(Configuration newConfig) {
                    if (newConfig != null && newConfig.fontScale > 0) {
                        mNonCompatScaledDisplay = application.getResources().getDisplayMetrics().scaledDensity;
                    }
                }

                @Override
                public void onLowMemory() {

                }
            });
        }
        float targetDensity = appDisplayMetrics.widthPixels / displayScale;
        float targetScaledDensity = targetDensity * (mNonCompatScaledDisplay / mNonCompatDisplay);
        int targetDensityDpi = (int) (160 * targetDensity);
        appDisplayMetrics.density = targetDensity;
        appDisplayMetrics.scaledDensity = targetScaledDensity;
        appDisplayMetrics.densityDpi = targetDensityDpi;
//        DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();
//        activityDisplayMetrics.density = targetDensity;
//        activityDisplayMetrics.scaledDensity = targetScaledDensity;
//        activityDisplayMetrics.densityDpi = targetDensityDpi;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值