JessYanCoding / AndroidAutoSize

🔥 A low-cost Android screen adaptation solution (今日头条屏幕适配方案终极版,一个极低成本的 Android 屏幕适配方案).
Apache License 2.0
13.47k stars 1.96k forks source link

autosize在华为P40多窗口下失效 #347

Open SweetSun1993 opened 3 years ago

SweetSun1993 commented 3 years ago

Environment

Bug Description:

三方应用口袋故事在华为P40多窗口模式下,字体显示异常。 口袋故事使用的是autosize库,当前设置: <meta-data android:name="design_width_in_dp" android:value="730"/> 且调整design_width_in_dp的值,在多窗口模式下显示字体大小未发生变化,得出结论,autosize未生效。

Log:

AutoSize.java 290行,setDensity方法中
DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();
setDensity(activityDisplayMetrics, density, densityDpi, scaledDensity, xdpi);
这行对于activity.getResources()的DisplayMetrics未生效

根因:
Android源码中getDisplayMetrics是ResourcesImpl中持有的mMetrics对象,华为EMUI代码中针对多窗口做了兼容性修改,在多窗口中返回的并非是ResourcesImpl中持有的mMetrics,而是其copy对象。直接修改copy对象中的属性无法生效。

Screenshot

Related Code:


能否在设置density的时候,通过updateConfiguration接口确保更新
样例代码:
        DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
        int ratio = configuration.densityDpi / (int)displayMetrics.density;
        displayMetrics.density += 0.1f;
        Configuration configuration = getResources().getConfiguration();
        configuration.densityDpi = (int) (displayMetrics.density * ratio);
        getResources().updateConfiguration(configuration,displayMetrics);

### Others:
CaiHong9225 commented 3 years ago

我也发现了这个问题,在多窗口的车机上,无法修改density 。

JessYanCoding commented 3 years ago

试试覆盖 getResources 返回一个经过代理的 Resources 对象给 View对象,让 View 中拿到的 mMetrics 对象和 setDensity 的 mMetrics 对象是用一个

https://github.com/JessYanCoding/AndroidAutoSize/issues/1#issuecomment-504654664

wx962464 commented 10 months ago

@SweetSun1993 最后此问题则呢么解决处理的?可否提供下思路或者示例代码