Android实际开发中会遇到各种各样的机型,所以就需要对多种机型进行适配。常见的适配在这类就不详细介绍了,大家可以参考这里的系列文章Android通用屏幕适配讲解的已经很详细了。下面说的是:当修改系统的字体大小、显示大小、默认分辨率的情况下,如何明智的进行适配。

一、修改系统字体大小与显示大小:

设置--->显示--->字体与显示大小:

会看到有如下两项:

1、字体大小:

我们实际开发中习惯将字体的单位(sp)作为默认大小单位。当使用sp作为字体单位是,具体的字体大小是跟随系统字体大小的设置而变化的。所以当希望布局的字体跟随系统设置字体的大小改变的情况下就可以使用sp作为字体大小单位。

当你已经使用的字体单位是sp,你又不想跟随系统设置字体的大小改变而改变的情况下,可以在Activity中使用如下方式:

    @Overridepublic void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);if (newConfig.fontScale != 1) {//非默认值getResources();}super.onConfigurationChanged(newConfig);}@Overridepublic Resources getResources() {Resources res = super.getResources();if (res.getConfiguration().fontScale != 1) {//非默认值Configuration newConfig = new Configuration();newConfig.setToDefaults();//设置默认res.updateConfiguration(newConfig, res.getDisplayMetrics());}return res;}

而当如果不希望该页面布局的字体大小随系统设置字体的大小改变的情况下就可以直接使用dp作为字体大小单位。此时修改系统的字体大小,布局中的字体是不会变化的。【其实现在很多开发中的字体大小都使用了dp作为字体单位,原因是可以有效避免改变字体大小引起的UI布局错乱】。

2、显示大小:

显示大小是7.0及以上系统才支持的功能【如上图】(当然有些手机商家系统自动屏蔽了该功能,所以你在设置中找不到,一般华为手机是具有这个功能的)。

当然很多人要问,当我改变了显示大小的时候,具体改变的是什么。其实最终改变的就是dpi (dots per inch 即每英寸像素数),而dp与px之间的一个很重要的公式:1dp = 1px * (dpi / 160) ,就是根据dpi算出来的。所以当显示大小调大的时候dpi也会变大,所以最终每1dp占有的像素数就会变大,而当系统分辨率不变的其情况下,对应的dp值就会占用比较大的UI空间(宽度/高度),所以相应的UI显示会变大。

如果希望修改系统”显示大小“的时候也不改版原有的UI布局大小,那么可以使用如下方式:

package com.hongri.layout.util;import java.lang.reflect.Method;import android.content.Context;
import android.content.res.Configuration;
import android.os.Build;
import android.util.Log;
import android.view.Display;/*** Created by zhongyao on 2019-09-03.*/
public class DisplayUtil {private static final String TAG = DisplayUtil.class.getSimpleName();/*** 系统设置"显示大小"时原有UI样式保持不变:** 1、当调节手机系统"显示大小"【调大】的时候,相应的dpi会变大【dp = (dpi/160) * px】,此时dp就会变大,所以相应的UI布局就会变大。* 2、当调节手机系统"分辨率"【调小】的时候,相应的dpi会变小【比如由480-->320】。如果此时使用技术手段使dpi保持不变,那么相同的dp就会占用更多的px,所以UI布局就会变大。** @param context*/public static void setDefaultDisplay(Context context) {if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {Configuration origConfig = context.getResources().getConfiguration();//获取手机出厂时默认的densityDpi【注释1】origConfig.densityDpi = getDefaultDisplayDensity();Log.d(TAG, "densityDpi: " + origConfig.densityDpi);context.getResources().updateConfiguration(origConfig, context.getResources().getDisplayMetrics());}}public static int 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) {e.printStackTrace();return -1;}}
}

除了上面一种方式之外,还有一种方式,可以达到同样的效果,

    /*** 获取手机出厂时默认的densityDpi并设置给手机* 在需要用到的activity中的onCreate中调用该方法* @param context*/public static void setDefaultDisplay(Context context) {if(Build.VERSION.SDK_INT > 23) {Configuration origConfig = context.getResources().getConfiguration();origConfig.densityDpi = getDefaultDisplayDensity(Display.DEFAULT_DISPLAY);//获取手机出厂时默认的densityDpicontext.getResources().updateConfiguration(origConfig, context.getResources().getDisplayMetrics());}}/*** 获取手机出厂时默认的densityDpi* @param displayId* @return*/public static int getDefaultDisplayDensity(int displayId) {try {final IWindowManager wm = WindowManagerGlobal.getWindowManagerService();return wm.getInitialDisplayDensity(displayId);} catch (RemoteException exc) {return -1;}}

不过远端打包的时候jar包有时会找不到WindowManagerGlobal相关类,所以并没有使用该方法

然后在Activity设置布局前调用即可:

你会发现,即使调整”显示大小“的时候,也会保持默认原有的UI展示大小。但是,使用这种方式会引入如下问题:

1、这种方式会改变整体的dpi(不仅仅是该Activity)。所以其他页面也会受到影响。

2、另一方,当修改手机系统的分辨率【某些部分手机支持修改手机分辨率】的时候,比如调小了分辨率。那么【注释1】你使用的还是默认分辨率的dpi,所以根据计算公式:1dp = 1px * (dpi / 160),由于dpi还是比较大,所以现在每1dp所占有的像素数就会变多。所以,当前的1dp包含的像素数是大于小分辨率下1dp的像素数。所以UI布局会相应的变大,甚至变大的情况有可能导致布局错乱或展示不全。

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

二、修改分辨率:

设置--->显示--->屏幕分辨率:

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

附:dpi、分辨率、density关系表

文件夹名称 分辨率 dpi density
ldpi   120dpi 0.75
mdpi   160dpi  1
hdpi 480*800 240dpi 1.5
xhdpi 720*1280 320dpi 2
xxhdpi 1080*1920 480dpi 3
xxxhdpi 1440*2560 640dpi 4

布局适配是一门学问。不同的系统及厂商也会有新的变化。需要不断的关注学习才能运用自如!!!

参考:

Android屏幕适配 px,dp,dpi及density的关系与深入理解

Support different pixel densities【官网】

深度阅读(O(∩_∩)O):

Android面试题总结(最全)

Android 屏幕适配(修改系统字体大小、显示大小、修改分辨率相关适配)相关推荐

  1. android 设置ios 字体大小设置,解决修改系统字体大小APP字体跟着变大的问题

    前言 最近在做项目的时候,碰到了这个问题,具体是:app中字体大小用了sp,然后修改手机系统字体大小后,sp设置的文字大小跟着系统变了,导致了布局挤压以及一系列的问题,经过研究找到了解决方法,在此记录 ...

  2. Android 10.0 修改Recovery字体图片的大小(正在清理)文字大小

    1.概述 在10.0系统产品开发中,进行Recovery 恢复出厂设置时 发现 真正清理的 字体小了 产品不满意 所以要求改大一点字体 于是 就只能去看Recovery部分的源码 这部分都是C 语言的 ...

  3. mtk8788 android 9.0 加大系统字体和图标

    由于屏幕(320*320)太小了,客户提个需求希望将APP图标跟系统字体加大,APP图标加大实际就是增大屏幕密度.修改如下: 1.增大密度 --- a/device/mediateksample/tb ...

  4. Android7.1修改系统默认多媒体音量大小

    Android7.1修改系统默认多媒体音量大小 始修改\frameworks\base\packages\SettingsProvider\res\values\defaults.xml def_mu ...

  5. win10更改计算机属性,Win10电脑怎么修改系统字体?详细更改教程请看这里!

    在平时的日常生活当中,无论是使用手机玩耍,还是使用电脑工作,很多小伙伴都会默认使用手机或电脑上的字体.但是在长期的使用下,默认字体跟默认壁纸一样,会越看越觉得不喜欢了. 就比如说win10系统电脑的默 ...

  6. Android 修改系统字体大小,导致页面展示异常解决方案

    Android系统默认是允许修改系统本身的字体大小的,导致页面展示异常. 页面展示异常是因为系统字体大小影响到了程序中字体的单位sp,所以解决此问题的方案1是,将布局中字体大小的单位sp换成dp 解决 ...

  7. 原 matplotlib命令与格式:系统字体与显示中文

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/helunqu2017/article/ ...

  8. WinCE 修改系统字体 开启ClearType平滑字体

    系统字体: "Wt"=宽度[正负相等:A=-A,并且过大的时候例如这里的:fffffff4按X=FFFFFFFF-X] "Ht"=高度[正负相等:A=-A,并且 ...

  9. 如何修改Word页面的显示大小

    有时我们收到一份文件,页面大小显示不便阅读修改,那么怎么修改页面显示大小呢?以最常用的极速办公speedoffice为例. 1.首先,我们打开一份Word文档,可以看到右下角默认缩放是100%: 2. ...

最新文章

  1. 从「王师傅一共损失了多少钱」说开去
  2. wiki维基百科上logo中字母的意思是什么?
  3. PTA-1022——Digital Library
  4. Java多线程--list.parallelStream().forEach()使用实例
  5. 和菜鸟一起学linux之DBUS基础学习记录
  6. 工作285:判断绑定逻辑
  7. c语言编程函数补充上机题,2011年计算机二级C语言上机操作题及答案(10)
  8. memcache的使用入门C++代码
  9. es 模糊查询_ES系列11:Term-level queries 之 3种模糊查询和terms_set query
  10. Reacr-Native Android 环境搭建 、运行项目(二)Window
  11. 微服务在微信的架构实践
  12. 神坛上的插画师真的高薪且自由吗?
  13. boost电路输出电流公式_boost升压电路参数计算
  14. [A3C]:算法原理详解
  15. java代码合成多张图片成一张
  16. 从项目中学习Django 天天生鲜---------前台首页分析
  17. python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置...
  18. 【密码学】HMAC与HS256算法
  19. Linux局域网共享打印机(实用型文档)
  20. 项目管理第十三章项目相关方管理

热门文章

  1. React Native之ListView实现九宫格效果
  2. pm4py、graphviz绘图中文乱码问题
  3. Ubuntu 17.10安装NVIDIA显卡驱动后画面撕裂的解决办法
  4. C语言小入门之第四篇【实型数据】
  5. javax.mail.FolderClosedException: * BYE JavaMail Exception: java.io.IOException: Connection dropped
  6. 创建线程池有哪几种方式
  7. 09_线性系统的稳态误差(静态误差)
  8. VUE 集成 LODOP插件打印
  9. 简单复现 残差网络、Googlenet、mobilenet、SqueezeNet、ShuffleNet、Densenet
  10. python一行搞定Z-score标准化