Android中px, ppi, dpi, dp, dip, sp概念解析

来源:互联网 发布:tina软件是否免费 编辑:程序博客网 时间:2024/05/16 10:02

前几天在面试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的计算公式为:
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的关系还是很有必要的,面试中也会被问到的哦~

0 0