屏幕适配遇到P30 的坑

问题原因:

手上的APP希望显示手机初始字体大小,且不随系统显示和字体大小的变更变化。

使用方案,设置字体为默认,显示大小为初始化配置。方案如下:

Application.java



  @Override
    public void onConfigurationChanged(Configuration newConfig) {
        if (newConfig.fontScale != 1) { //非默认值
            getResources();
        }
        super.onConfigurationChanged(newConfig);
    }

    @Override
    public Resources getResources() {
        Resources res = super.getResources();
        if (res.getConfiguration().fontScale != 1) {//非默认值
            Configuration newConfig = new Configuration();
            newConfig.setToDefaults();//设置默认

            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {

                 newConfig.densityDpi = DisplayUtil.getDefaultDisplayDensity();


                if (densityDpi == -1) {
                    densityDpi = DisplayUtil.getDefaultDisplayDensity();

            
                }
             


            }
            res.updateConfiguration(newConfig, res.getDisplayMetrics());
        }
        return res;
    }




DisplayUtil.getDefaultDisplayDensity 方法是通过反射调用:

   try {
            Class clazz = Class.forName("android.view.WindowManagerGlobal");
            Method method = clazz.getMethod("getWindowManagerService");
            method.setAccessible(true);
            Object iwm = method.invoke(clazz);
            Method getInitialDisplayDensity = iwm.getClass().getMethod("getInitialDisplayDensity"
                    , int.class);
            getInitialDisplayDensity.setAccessible(true);
            Object densityDpi = getInitialDisplayDensity.invoke(iwm, Display.DEFAULT_DISPLAY);
            return (int) densityDpi;
        } catch (Exception e) {

            ToastUtils.showToast(e.getMessage());

            e.printStackTrace();
            return -1;
        }

问题导致

这个方案在大部分设备上没有问题,在P30上布局等都是变大,显示内容不完全。

通过getDefaultDisplayDensity 得到像素密度为480!!!!!

在通过当前系统密度比值density*160得到的密度却是少于480!!!,所以当前UI显示的图都是

drawable-xxhdpi的图,造成UI错乱。


            DisplayMetrics displayMetrics = res.getDisplayMetrics();


            float initDensity = displayMetrics.density;

            int initTargetDensityDpi = (int) (initDensity * 160);

计算出来的密度设置成显示密度之后,显示正常!!!

这难不成华为留的坑?管不了,先尝试解决。

解决方案

既然读取出来的初始化屏幕密度有问题,而我自己计算出来的可以。

那么

1.设置屏幕到初始化密度后。

2.读取屏幕密度比值density,计算出正确的密度,再次修改。

正确的密度参考:

/**
 * .drawable-ldpi (dpi=120, density=0.75)
 *
 * .drawable-mdpi (dpi=160, density=1)
 *
 * .drawable-hdpi (dpi=240, density=1.5)
 *
 * .drawable-xhdpi (dpi=320, density=2)
 *
 * .drawable-xxhdpi (dpi=480, density=3)
 *
 * .drawable-xxxhdpi (dpi=640, density=4)
 */

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值