前几天在面试Android开发实习生的过程中,我感触很深地就是好多基础概念掌握地不牢靠,明明在项目中用过的却在面试中不能正确回答出细节来,所以我决定在接下来的学习过程中,每遇到一个知识点,就完整地梳理一遍,写到博客里,一方面巩固自己的记忆,另一方面也能帮助众多的Android初学者,一举两得,我一定要坚持~
言归正传,首先来看看这几个概念:
- px : pixels(像素)
- ppi : pixels per inch(像素密度,所表示的是每英寸所拥有的像素数量)
- dpi : dots per inch(每英寸的点数)
- dp/dip : device independent pixels(设备独立像素)
- sp : scaled pixels(放大像素)
px(像素)
一个像素通常被视为图像的最小的完整采样。通常所说的分辨率比如1280*720,指的就是可以显示1280*720个像素。
ppi(像素密度)
屏幕分辨率大不一定意味着显示更清晰,因为手机尺寸不知道,而屏幕的ppi越高,表示屏幕的像素密度越高,这样屏幕内容看起来就更加细腻,看起来也就更加真实。ppi的计算公式为:
计算一下小米手机2屏幕的PPI:4.3英寸、分辨率1280*720
PPI=√(1280^2+720^2)/4.3=341.5359……≈342
dpi(屏幕密度)
屏幕密度与dpi密切相关,dpi是每英寸的点数。也就是说,密度越大,每英寸内容纳的点数就越多。
android.util包下有个DisplayMetrics类可以获得密度相关的信息。最重要的是densityDpi这个成员,它有如下几个常用值:
DENSITY_LOW = 120
DENSITY_MEDIUM = 160 //默认值
DENSITY_TV = 213 //TV专用
DENSITY_HIGH = 240
DENSITY_XHIGH = 320
DENSITY_400 = 400
DENSITY_XXHIGH = 480
DENSITY_XXXHIGH = 640
那dpi和ppi在Android手机中是什么关系呢?具体可以参考PPI vs. DPI: what’s the difference?
dp(设备独立像素)
这个和设备硬件有关,不同设备有不同的显示效果。在做项目时,为了适配市场上繁多的手机分辨率,建议使用dp。
不同分辨率下如何适配
首先介绍一下市面上常见的手机屏幕参数:
尺寸/英寸 | 分辨率 | 像素密度/ppi |
---|---|---|
4.0 | 800x480(WVGA) | 233 |
4.3 | 960x540(QHD) | 256 |
4.7 | 1280x720(HD) | 312 |
5.0 | 1024x768(XGA) | 265 |
5.0 | 1280x720(HD) | 294 |
5.0 | 1920x1080(FHD) | 441 |
6.0 | 2560x1600(WQXGA) | 498 |
以上只是市场上主流的手机屏幕参数,而根据OpenSignal的调查,2014年市面上有18796种不同的Android设备,到现在这个数字肯定又增长了很多,面对如此碎片化的局面,作为开发者应该怎么适配不同的屏幕呢?
其实,Android考虑到了这一点,不是提供了dp和sp这两种虚拟像素单位了吗。dp的大小不是一个物理值,而是由操作系统根据屏幕大小和密度动态渲染出来的。
px和dp之间的换算关系很简单:
px=dp*(dpi/160)
可以看到用dp来定义大小就不用担心不同屏幕下显示不一致的问题了,因为不同屏幕小dp对应的px是不同的,可以做到适配不同的屏幕。
sp(放大像素)
SP 全称是 Scale-independent Pixels,用于字体大小,其概念与DP是一致的,也是为了保持设备无关。因为Android用户可以根据喜好来调整字体大小,所以要使用sp来表示字体大小。
总结:
这些概念是很容易混淆的,我们在做项目时最常用的还是dp和sp,但是搞清楚它们与px,dpi,ppi的关系还是很有必要的,面试中也会被问到的哦~