彻底了解Android hdpi ldpi mdpi xhdpi xxhdpi适配以及sp、dp等常用尺寸单位

工作环境(蓝色粗体字为特别注意内容)
1,系统环境:Win7 Ultimate sp1、Android Studio 3.2

在进入正题之前,先来了解几个概念:

px     : 像素(即像素点,屏幕/图片等都是由一个个很小的像素点构成的一个平面)
dip/dp  : Density-independent pixel 独立像素密度
dpi     : dot per inch 就是每英寸的像素数,也叫做屏幕密度。这个值越大,屏幕就越清晰。
ppi     : pixel per inch 指每英寸所拥有的像素 
ppi计算 :(宽度的平方 + 高度的平方)开根号 / 对角线的长度 
Density : density值表示每英寸有多少个显示点,density计算: DPI / (160像素/英寸) 
分辨率  : 是指屏幕上垂直方向和水平方向上的像素个数。比如iPhone5S的分辨率是1136*640;Samsung 
           Note3的分辨率是1920*1080;
屏幕尺寸:屏幕斜对角线的长度(英寸),比如5寸屏表示屏幕斜对角线长度为5英寸
sp     :android字体大小单位,含义跟dp一样

知识点1:在160dpi(标准dpi)的屏幕上,1dip=1px。
为啥 标准dpi = 160
(1)Android Design [1] 里把主流设备的 dpi 归成了四个档次,120 dpi、160 dpi、240 dpi、320 dpi
实际开发当中,我们经常需要对这几个尺寸进行相互转换(比如先在某个分辨率下完成设计,然后缩放到其他尺寸微调后输出),一般按照 dpi 之间的比例即 2:1.5:1:0.75   来给界面中的元素来进行尺寸定义。
也就是说如果以 160 dpi 作为基准的话,只要尺寸的 DP 是 4 的公倍数,XHDPI 下乘以 2,HDPI 下乘以 1.5,LDPI 下乘以 0.75 即可满足所有尺寸下都是整数 pixel 。
但假设以 240 dpi 作为标准,那需要 DP 是 3 的公倍数,XHDPI 下乘以 1.333,MDPI 下乘以 0.666 ,LDPI 下除以 2
而以 LDPI 和 XHDPI 为基准就更复杂了,所以选择 160 dpi
(2)这个在Google的官方文档中有给出了解释,因为第一款Android设备(HTC的T-Mobile G1)是属于160dpi的。

知识点2:dpi具体数值的计算

例:比如一个机器,屏幕4寸,分辨率480X800,求该机器屏幕的dpi。
  勾股定理,先求出对角线的像素:val=sqrt(480^2+800^2),4是对角线长度,对角线像素除以对角线长度(英寸):dpi=val/4,算出来大概是 dpi = 233 像素/英寸。
  那么density就是 (233 px/inch)/(160 px/inch)=1.46 左右

我们写布局的时候,肯定还是要知道1个dp到底有多少px的。
换算公式如下: dp = (DPI/(160像素/英寸))px = density px,即对上例,1dp=1.46px
注意,这里都是带单位的。px是单位,dp是单位,density没单位。当安卓系统字号设为“普通”时,sp与px的尺寸换算和dp与px是一样的。比如某个文字大小在720×1280(xhdpi)的PS画布中是24px,320dpi/160dpi=2,即2倍的关系,那么告诉工程师,这个文字大小是12sp。

注意,图标资源一定要放到屏幕实际对应的dpi目录中去,否则实际显示可能会偏大或者偏小,比如我手头项目的屏幕是7寸1280*800的平板,则需要放到mipmap-tvdpi目录中去,如果没有此目录则需要自行手动创建!

猜你喜欢

转载自blog.csdn.net/pang9998/article/details/87980436