美文网首页
Android 修改字体/显示及分辨率

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

作者: __Y_Q | 来源:发表于2020-11-30 17:41 被阅读0次

    问题:在系统设置中修改字体大小、显示大小和分辨率大小,导致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展示,但是使用这种方式会引入如下问题:
    • 会改变整体的dpi(不仅仅是该Activity)其他页面也会受到影响。
    • 当修改手机系统的分辨率【某些部分手机支持修改手机分辨率】的时候,
      比如调小了分辨率,根据计算公式:1dp = 1px * (dpi / 160),由于dpi还是比较大,所以现在每1dp所占有的像素数就会变多,当前的1dp包含的像素数是大于小分辨率下1dp的像素数。所以UI布局会相应的变大,甚至变大的情况有可能导致布局错乱或展示不全。

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

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

    相关文章

      网友评论

          本文标题:Android 修改字体/显示及分辨率

          本文链接:https://www.haomeiwen.com/subject/hucdwktx.html