栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

屏幕适配遇到P30 的坑

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

屏幕适配遇到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,计算出正确的密度,再次修改。

正确的密度参考:

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/389741.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号