美文网首页
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 修改字体/显示及分辨率

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

  • DisplayMetrics android 屏幕分辨率

    Android.util包下 DisplayMetrics 提供了关于显示的基本信息,如显示大小、屏幕分辨率和字体大小

  • 2019-01-23

    deepin 安装Pycharm 后输出中文显示方块乱码 安装字体解决 修改Pycharm 中文显示字体files...

  • netbeans修改菜单字体大小

    由于远程使用vnc分辨率的问题,修改了我的linux桌面字体,对于netbeans中的编辑字体可以通过netbea...

  • Ubuntu 修改分辨率

    win10 hype-V 安装Ubuntu 修改窗口显示分辨率 修改 /etc/default/grub 找到 ...

  • 导航条及状态栏的设置

    // 修改导航条背景色 // 修改导航条上字体颜色及大小 // 修改状态栏字体颜色

  • android 字体修改

    第一步,在assets目录下新建fonts目录,把ttf字体文件放到这。 第二步,程序中调用: 2.在xml文件中...

  • Android屏幕适配

    前言 在Android开发中,由于Android碎片化严重,屏幕分辨率千奇百怪,而想要在各种分辨率的设备上显示基本...

  • 一种极低成本的Android屏幕适配方式

    原始链接 在Android开发中,由于Android碎片化严重,屏幕分辨率千奇百怪,而想要在各种分辨率的设备上显示...

  • PHPStorm修改UI字体

    【注】本文修改的是软件界面字体,不是修改文本编辑部分的字体。 PHP Storm界面的字体默认是12号,在大屏显示...

网友评论

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

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