Android 修改字体/显示及分辨率

2020-11-30  本文已影响0人  __Y_Q

问题:在系统设置中修改字体大小、显示大小和分辨率大小,导致App中显示出现异常。

解决:

  1. 当系统修改字体大小,我们开发过程中习惯将字体的单位设置为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());
      }
    }
    
  2. 当系统修改显示大小,显示大小是7.0及以上系统才支持的功能,有些手机商家系统自动屏蔽了该功能。当我改变了显示大小的时候,其实最终改变的就是dpi,而dp与px之间的一个很重要的公式:1dp = 1px * (dpi / 160),所以当显示大小调大的时候dpi也会变大,所以最终每1dp占有的像素数就会变大,而当系统分辨率不变的其情况下,对应的dp值就会占用比较大的UI空间,相应的UI显示会变大。如果希望修改系统“显示大小”的时候也不改版原有的UI布局大小,可以在Activity设置布局前调用调用如下:
    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;
        }
    }
    
    设置完成之后,调整“显示大小”的时候,也能保持默认原有的UI展示,但是使用这种方式会引入如下问题:

综上所述不建议使用技术手段控制系统的显示大小【经验证,市场上绝大多数的APP都不会控制显示大小,也不符合用户习惯

  1. 修改分辨率, 一般修改分辨率的情况下,不需要做适配。因为修改分辨率后,相应的布局大小是不会变化的。特殊情况是如果你使用技术手段控制了系统的显示大小,此时再修改分辨率的情况下,就会有问题了。原因就是【比如你调大显示大小,调小分辨率】那么此时屏幕是小分辨率,但还得使用默认的原有(大分辨率)的dpi,所以会导致布局变大。
上一篇下一篇

猜你喜欢

热点阅读