问题原因:
手上的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) */