手机屏幕的各个单位:
手机像素(px):元素的基本单位,手机像素越高显示的图像更清晰
屏幕像素密度(dpi):屏幕的像素密度
density:px与dp的转换率 density =像素密度(dpi)/160
手机尺寸:手机屏幕对角线的宽度
dp:dp值由px和density 转换而来
假设手机屏幕分辨率为:
1920*1080
,屏幕尺寸为5
: 我们可以通过勾股定理计算得到对角线的像素为2203px
那么像素密度(dpi)为2203/5=440
: 通过像素密度可以计算出dp
和px
的转换率(density)
值等于:440/160=2.75
通过
density
我们就可以算出我们屏幕宽度等于多少个dp
值:
设备 1:屏幕宽度为1080px,480DPI
,总 dp 宽度:1080 / (480 / 160) = 360dp
设备 2:屏幕宽度为1440,560DPI
,总 dp 宽度:1440 /(560 / 160) = 411dp
我们可以看到 ,不同的设备计算出的屏幕宽度的dp
值是不一样的,它由density
值决定。 如果你在布局文件中设置了一个宽度为100dp
的Button
,系统会根据将density
值将dp
转化成px
,你会发现这个Button
占了第一个设备屏幕宽度的27.8%
,占了第二个设备屏幕宽度的24.3%
。因此就需要我们进行屏幕适配了。
我们知道
dp
值是我们描述px
的一个单位而已, 最终都会被转化成px
显示在设备上,每个设备的宽度dp
值都不同。而我们填写单位的时候都是dp
值,这个dp
值是定死的,这就导致我们的view
显示在不同屏幕上的占比不同。
而设备的总dp
值是我们根据density
计算出来的一个描述px
的单位。假设如果我们每个设备的屏幕总 dp 宽度不变。我们就可以堆导出如下公式。
(dp)/ (总dp) = (px) / (总px)
通过推导:
(px)/ (dp) = (总px) / (总dp) = density
我们只需要规定所有设备总的dp
值都是一样的,再通过上面的公式计算出density
,然后修改系统的density
值。当我们的view
放在任何的屏幕上占比都是一样的。针对上面俩个不同的设备进行验证: 假设我们设定设备屏幕宽度为
375 dp
第一个设备的density=1080/375=2.88
,我们的Button转换成px=100*2.88=288
占比度:288/1080=26.6%
第二个设备的density=1440/375=3.84
,我们的Button转换成px=100*3.84=384
占比度:384/1440=26.6%