Android 修改字体/显示及分辨率
2020-11-30 本文已影响0人
__Y_Q
问题:在系统设置中修改字体大小、显示大小和分辨率大小,导致App中显示出现异常。
解决:
- 当系统修改字体大小,我们开发过程中习惯将字体的单位设置为sp,这时具体的大小是跟随系统字体大小的设置而变化的,所以当我们希望不随着系统的“字体大小”改变而改变的话,可以在Application、BaseActivity、BaseFragment中初始化时设置如下:
public static void disableSizeChange(Resources res) { Configuration myConfig = res.getConfiguration(); //字体非默认值 if(res.getConfiguration().fontScale != 1){ myConfig.fontScale = 1; res.updateConfiguration(myConfig,res.getDisplayMetrics()); } }
- 当系统修改显示大小,显示大小是7.0及以上系统才支持的功能,有些手机商家系统自动屏蔽了该功能。当我改变了显示大小的时候,其实最终改变的就是dpi,而dp与px之间的一个很重要的公式:1dp = 1px * (dpi / 160),所以当显示大小调大的时候dpi也会变大,所以最终每1dp占有的像素数就会变大,而当系统分辨率不变的其情况下,对应的dp值就会占用比较大的UI空间,相应的UI显示会变大。如果希望修改系统“显示大小”的时候也不改版原有的UI布局大小,可以在Activity设置布局前调用调用如下:
设置完成之后,调整“显示大小”的时候,也能保持默认原有的UI展示,但是使用这种方式会引入如下问题:public static void disabledDisplayDpiChange(Resources res){ Configuration myConfig = res.getConfiguration(); //系统版本大于 7.0 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ int defaultDisplayDensity = getDefaultDisplayDensity(); //显示大小是否非默认值 boolean isChangeDensityDpi = res.getConfiguration().densityDpi != defaultDisplayDensity; if(isChangeDensityDpi){ myConfig.densityDpi = defaultDisplayDensity; res.updateConfiguration(myConfig, res.getDisplayMetrics()); } } } public static int getDefaultDisplayDensity(){ try { Class<?> aClass = Class.forName("android.view.WindowManagerGlobal"); Method method = aClass.getMethod("getWindowManagerService"); method.setAccessible(true); Object iwm = method.invoke(aClass); 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) { e.printStackTrace(); return -1; } }
- 会改变整体的dpi(不仅仅是该Activity)其他页面也会受到影响。
- 当修改手机系统的分辨率【某些部分手机支持修改手机分辨率】的时候,
比如调小了分辨率,根据计算公式:1dp = 1px * (dpi / 160),由于dpi还是比较大,所以现在每1dp所占有的像素数就会变多,当前的1dp包含的像素数是大于小分辨率下1dp的像素数。所以UI布局会相应的变大,甚至变大的情况有可能导致布局错乱或展示不全。
综上所述不建议使用技术手段控制系统的显示大小【经验证,市场上绝大多数的APP都不会控制显示大小,也不符合用户习惯
- 修改分辨率, 一般修改分辨率的情况下,不需要做适配。因为修改分辨率后,相应的布局大小是不会变化的。特殊情况是如果你使用技术手段控制了系统的显示大小,此时再修改分辨率的情况下,就会有问题了。原因就是【比如你调大显示大小,调小分辨率】那么此时屏幕是小分辨率,但还得使用默认的原有(大分辨率)的dpi,所以会导致布局变大。