Android 屏幕适配详解
Android 屏幕适配详解
在Android开发中,屏幕适配是一个常见的问题。本文将详细介绍屏幕适配的相关概念和解决方案,帮助开发者更好地理解屏幕适配的原理和实践方法。
一、相关概念
1.1 屏幕尺寸(screen size)
屏幕大小是手机对角线的物理尺寸,单位是:英寸(inch),1 inch =2.54 cm(厘米)
1.2 屏幕分辨率(Resolution)
分辨率就是是指屏幕上垂直方向和水平方向上的像素个数,一般描述为:横像素 * 纵像素,如 720 * 1280,就是在纵方向上有1280个像素点,在横方向上有720个像素点。
日常所说的分辨率有两个概念,一个指显示器的分辨率,另一个指图像的分辨率。显示器分辨率指显示器所能显示的像素多少(720px*1280px),显示器可显示的像素越多,画面就越精细。图像分辨率则是单位英寸中所包含的像素点数,比如photoshop 里新建画布时设置的图像分辨率72ppi,其定义更趋近于分辨率本身的定义。
1.3 像素(pixel)
Pixels 我们看到屏幕上的图像由一个个像素组成,像素里包含色彩信息。如常说的手机分辨率:1080 x 1920 指的是手机宽度可展示1080像素,高度可展示1920像素。
1.4 ppi
ppi(Pixels Per Inch)即像素密度,指每英寸包含的物理像素的数量。ppi 是设备在物理上的属性值,取决于屏幕自身。设备的宽高都属于客观不可改变的值,所以 ppi 也是无法修改的,是硬件上一个客观存在无法改变的值。其计算公式如下:
[ppi = \frac{\sqrt{(宽^2 + 高^2)(单位px)}}{屏幕尺寸(单位inch)} ]
1.5 dpi
dpi(Dots Per Inch)原先用于在印刷行业中描述每英寸包含有多少个点,在 Android 开发中则用来描述屏幕像素密度。屏幕像素密度决定了在软件概念上单位距离对应的像素总数,是手机在出厂时就会被写入系统配置文件中的一个属性值,一般情况下用户是无法修改该值的,但在开发者模式中有修改该值的入口,是软件上一个可以修改的值。
个人理解:dpi(dots per inch)、ppi(pixels per inch),前者突出图像的打印像数密度,后者突出设备的像数密度。
1.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 |
1.7 sp
sp(Scaled Pixels):通常用于指定字体的大小,当用户修改手机显示的字体时,字体大小会随之改变。
二、常见问题解答
2.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不配。
2.2 为啥Android要引入dp概念?
Android屏幕尺寸的碎片化很严重,各种分辨率尺寸的设备层出不穷。如果以px作为单位,会出现如下现象:
(1)不同分辨率的设备,对应的px的长度不一致;
图二设备:分辨率1280x720,dpi=240,即屏幕的宽为720/1.5=480dp;
图一设备:分辨率1920x1080,dpi=360,即屏幕的宽为1080/2.25=480dp;