Android 屏幕适配

android · 浏览次数 : 10

小编点评

一、目的 最近在调试一款设备时,发现视图的样式尺寸偏大,像老人机。经过了解,这是一个Android屏幕适配问题。为了更好地解决这个问题,我需要了解Android屏幕相关的概念及弄清楚该问题的原因。 二、环境平台 平台:UIS7870SC 版本:Android 13 三、相关概念 3.1 屏幕尺寸(screen size) 屏幕大小是手机对角线的物理尺寸,单位是英寸(inch),1 inch = 2.54 cm(厘米)。 3.2 屏幕分辨率(Resolution) 分辨率是指屏幕上垂直方向和水平方向上的像素个数,一般描述为:横像素 * 纵像素,如 720 * 1280,就是在纵方向上有1280个像素点,在横方向上有720个像素点。 3.3 像素(pixel) Pixels 我们看到屏幕上的图像由一个个像素组成,像素里包含色彩信息。如常说的手机分辨率:1080 x 1920 指的是手机宽度可展示1080像素,高度可展示1920像素。 3.4 ppi(Pixels Per Inch) ppi(Pixels Per Inch)即像素密度,指每英寸包含的物理像素的数量。ppi 是设备在物理上的属性值,取决于屏幕自身。设备的宽高都属于客观不可改变的值,所以 ppi 也是无法修改的,是硬件上一个客观存在无法改变的值。其计算公式如下: $$ppi = \frac{\sqrt{(宽^2 + 高^2)(单位px)}}{屏幕尺寸(单位inch)}$$ 3.5 dpi(Dots Per Inch) dpi(Dots Per Inch)原先用于在印刷行业中描述每英寸包含有多少个点,在 Android 开发中则用来描述屏幕像素密度。屏幕像素密度决定了在软件概念上单位距离对应的像素总数,是手机在出厂时就会被写入系统配置文件中的一个属性值,一般情况下用户是无法修改该值的,但在开发者模式中有修改该值的入口,是软件上一个可以修改的值。 3.6 dp/dip density-independent pixels,dip是缩写,也可以更简单些称作dp。该单位的目的是屏蔽不同设备密度差异。 根据不同的屏幕分辨率,与px有不同的倍数关系。规定:1dp等于屏幕像素密度为160ppi时1px的长度,因此dp在整个系统大小是固定的。公式:1dp=(屏幕ppi/ 160)px。为简便起见,Android 将所有屏幕密度分组为六种通用密度,具体如下表: 类别 | dp idensity (屏幕ppi/ 160) | ldpi(低) | mdpi(中) | hdpi(高) | xhdpi(超高) | xxhdpi(超超高) | xxxhdpi(超超超高) | 4.0 --- | --- | --- | --- | --- | --- | --- | --- | --- 3.7 sp(Scaled Pixels) 通常用于指定字体的大小,当用户修改手机显示的字体时,字体大小会随之改变。 四、Q&A 4.1 为啥dpi = 160? (1)这个在Google的官方文档中有给出了解释,因为第一款Android设备(HTC的T-Mobile G1)是属于160dpi的。 (2)如果以 160 dpi作为基准的话,只要尺寸的 DP是4的公倍数,XHDPI下乘以2,HDPI下乘以 1.5,LDPI下乘以 0.75 即可满足所有尺寸下都是整数 pixel,而其他的dpi不配。 4.2 为啥Android要引入dp概念? Android屏幕尺寸的碎片化很严重,各种分辨率尺寸的设备层出不穷。如果以px作为单位,会出现如下现象: (1)不同分辨率的设备,对应的px的长度不一致; (2)图二设备:分辨率1280x720,dpi=240,即屏幕的宽为720/1.5=480dp;图一设备:分辨率1920x1080,dpi=360,即屏幕的宽为1080/2.25=480dp;

正文

一、目的

        最近在调试一款设备,发现视图的样式尺寸偏大,像老人机。那时候也清楚是屏幕适配问题,但是脑子也仅想着通过修改分辨率的大小尝试修复该问题,没有想到其他手段调试。
        该问题也是一个Android开发者需应具备的基本知识点,这驱使我去了解Android屏幕相关的概念,及弄清楚该问题的原因。

二、环境

  1. 平台:UIS7870SC
  2. 版本:Android 13

三、相关概念

3.1 屏幕尺寸(screen size)

        屏幕大小是手机对角线的物理尺寸,单位是:英寸(inch),1 inch =2.54 cm(厘米)

3.2 屏幕分辨率(Resolution)

        分辨率就是是指屏幕上垂直方向和水平方向上的像素个数,一般描述为:横像素 * 纵像素,如 720 * 1280,就是在纵方向上有1280个像素点,在横方向上有720个像素点。
        日常所说的分辨率有两个概念,一个指显示器的分辨率,另一个指图像的分辨率。显示器分辨率指显示器所能显示的像素多少(720px*1280px),显示器可显示的像素越多,画面就越精细。图像分辨率则是单位英寸中所包含的像素点数,比如photoshop 里新建画布时设置的图像分辨率72ppi,其定义更趋近于分辨率本身的定义。

3.3 像素(pixel)

        Pixels 我们看到屏幕上的图像由一个个像素组成,像素里包含色彩信息。如常说的手机分辨率:1080 x 1920 指的是手机宽度可展示1080像素,高度可展示1920像素。

3.4 ppi

        ppi(Pixels Per Inch)即像素密度,指每英寸包含的物理像素的数量。ppi 是设备在物理上的属性值,取决于屏幕自身。设备的宽高都属于客观不可改变的值,所以 ppi 也是无法修改的,是硬件上一个客观存在无法改变的值。其计算公式如下:

\[ppi = \frac{\sqrt{(宽^2 + 高^2)(单位px)}}{屏幕尺寸(单位inch)} \]

3.5 dpi

        dpi(Dots Per Inch)原先用于在印刷行业中描述每英寸包含有多少个点,在 Android 开发中则用来描述屏幕像素密度。屏幕像素密度决定了在软件概念上单位距离对应的像素总数,是手机在出厂时就会被写入系统配置文件中的一个属性值,一般情况下用户是无法修改该值的,但在开发者模式中有修改该值的入口,是软件上一个可以修改的值。
        个人理解:dpi(dots per inch)、ppi(pixels per inch),前者突出图像的打印像数密度,后者突出设备的像数密度。

3.6 dp/dip

        density-independent pixels,dip是缩写,也可以更简单些称作dp。该单位的目的是屏蔽不同设备密度差异。
        根据不同的屏幕分辨率,与px有不同的倍数关系。规定:1dp等于屏幕像素密度为160ppi时1px的长度,因此dp在整个系统大小是固定的。公式:1dp=(屏幕ppi/ 160)px。为简便起见,Android 将所有屏幕密度分组为六种通用密度,具体如下表:

类别 dpi density
(屏幕ppi/ 160)
ldpi(低) 120dpi 0.75
mdpi(中) 160dpi 1.0
hdpi(高) 240dpi 1.5
xhdpi(超高) 320dpi 2.0
xxhdpi(超超高) 480dpi 3.0
xxxhdpi(超超超高) 640dpi 4.0

3.7 sp

        sp(Scaled Pixels):通常用于指定字体的大小,当用户修改手机显示的字体时,字体大小会随之改变。

四、Q&A

4.1 为啥dpi = 160?

(1)这个在Google的官方文档中有给出了解释,因为第一款Android设备(HTC的T-Mobile G1)是属于160dpi的。
(2)如果以 160 dpi作为基准的话,只要尺寸的 DP是4的公倍数,XHDPI下乘以2,HDPI下乘以 1.5,LDPI下乘以 0.75 即可满足所有尺寸下都是整数 pixel,而其他的dpi不配。

4.2 为啥Android要引入dp概念?

        Android屏幕尺寸的碎片化很严重,各种分辨率尺寸的设备层出不穷。如果以px作为单位,会出现如下现象:
(1)不同分辨率的设备,对应的px的长度不一致;
图二设备:分辨率1280x720,dpi=240,即屏幕的宽为720/1.5=480dp;
图一设备:分辨率1920x1080,dpi=360,即屏幕的宽为1080/2.25=480dp;

五、代码仓库地址

Demo地址:  https://gitee.com/linzhiqin/custom-demo

六、参考资料

https://blog.51cto.com/u_9420214/6336492
https://blog.csdn.net/qq_39312146/article/details/129271291
https://blog.51cto.com/u_16213653/7742791

https://j.eastday.com/p/161600562077011931

与Android 屏幕适配相似的内容:

Android 屏幕适配

目录一、目的二、环境三、相关概念3.1 屏幕尺寸(screen size)3.2 屏幕分辨率(Resolution)3.3 像素(pixel)3.4 ppi3.5 dpi3.6 dp/dip3.7 sp四、Q&A4.1 为啥dpi = 160?4.2 为啥Android要引入dp概念?五、代码仓库地

【Android 逆向】看雪题目:找出flag 如果输入正确则屏幕上的 hello会变成success

1. apk 安装到手机,只有一个输入框,随便输入点什么,提示error 2. apk拖入到jadx中 public class MainActivity extends AppCompatActivity { static int n = 0; public static byte[] su; p

买条新内存给台式机扩容,没想到出现玄学花屏

背景 我目前的配置是i5-8400,16G内存(两条威刚8G 2400) 然后在日常使用中,16G内存已经捉襟见肘了,无论是Android开发还是后端开发,每次编译都卡得很 正好双十一,就想着买条16G内存来扩容,组个32G的双通道。 某东看了一圈,2400的16G内存基本绝迹了,只能选择2666的

Android 自定义带动画的柱状图

功能分析 假设要使用柱状图展示用户一周的数据,通用的做法是对接三方图表SDK或者自己通过代码绘制。 1、三方SDK通常包体较大,且定制性差,对特定的UI需求兼容性差; 2、自己绘制,比较复杂,而且要考虑各种兼容适配; 今天,我们使用一种简单的方式,来制作柱状图,不仅代码简单,而且支持UI样式、动画自

有隙可乘 - Android 序列化漏洞分析实战

本文主要描述了FileProvider,startAnyWhere实现,Parcel不对称漏洞以及这三者结合产生的漏洞利用实战,另外阐述了漏洞利用的影响和修复预防措施,这个漏洞波及了几乎所有的Android手机,希望能带给读者提供一些经验和启发。

Android无障碍自动化结合opencv实现支付宝能量自动收集

Android无障碍服务可以操作元素,手势模拟,实现基本的控制。opencv可以进行图像识别。两者结合在一起即可实现支付宝能量自动收集。opencv用于识别能量,无障碍服务用于模拟手势,即点击能量。 当然这两者结合不单单只能实现这些,还能做很多自动化的程序,如芭芭农场自动施肥、蚂蚁庄园等等的自动化,

Android Media Framework(三)OpenMAX API阅读与分析

这篇文章我们将聚焦Control API的功能与用法,为实现OMX Core、Component打下坚实的基础。 1、OMX_Core.h OMX Core在OpenMAX IL架构中的位置位于IL Client与实际的OMX组件之间,OMX Core提供了两组API给IL Client使用,一组A

Android应用程序启动源码浅析-(三万字长文慎点&Android14)

在Android桌面Launcher源码浅析中介绍了Android的桌面程序Launcher是如何响应用户点击事件并启动App的,这篇文章继续介绍App在Android系统层的启动流程。 一、启动流程 sequenceDiagram participant User participant Laun

Android桌面Launcher源码浅析

在Android启动过程-万字长文(Android14)中介绍了Android系统的启动过程,本篇文章将继续介绍桌面应用Launcher。 一、Launcher介绍 在Android启动过程-万字长文(Android14)中提到Launcher是Android系统启动后,由SystemServerA

Android启动过程-万字长文(Android14)

在计算机启动过程和Linux内核Kernel启动过程介绍了计算机启动和内核加载,本篇文章主要介绍Android系统是如何启动的。 一、Android启动流程 Android系统的启动流程与Linux接近: sequenceDiagram participant Bootloader as 引导加载程