总结&备忘:android尺寸单位dp与mm

对于android UI设计的度量单位 <Understanding Density Independence in Android>一文已详细说明:

http://www.captechconsulting.com/blogs/understanding-density-independence-in-android

osc对应的中英对照:

http://www.oschina.net/translate/understanding-density-independence-android?cmp


之前没完全理解"dp"这货,以为就是绝对的精准的显示长度单位

今天突然脑袋卡顿了,那我为什么不直接使用"mm"或"in"呢

翻看了上面的资料 才完全理解dp

dp不保证在各手机上最终的显示效果是一致的绝对的长度,mm和in才是

dp定义应用在离散的一组"标准"的屏幕密度(Density Bucket)上,即我们常见的: ldpi,mdpi,hdpi,xhdpi,xxhdpi,...

在dp他的角度看来,所有的设备的屏幕密度都只有这几个规格: ldpi(120dpi),mdpi(160dpi),hdpi(240dpi),xhdpi(320dpi),xxhdpi(480dpi),...


系统换算dp为当前设备上的真实px值时,只会按照DensityBucket这几类标准的dpi来做换算,而不会使用当前设备的真实屏幕密度(dpi)


如:

我当前小米5手机的真实dpi(同ppi)是428,归类到了xxhdpi这一档,所以在换算真实px时是使用480dpi

当我想用dp单位来显示20mm效果的时候,按dp的定义(160dp/inch)就是:20mm=(160dp/inch)/(25.4mm/inch)*20mm=125.98dp

再按dp的定义:在屏幕密度160dpi下1dp=1px. 得:480dpi下1dp=3px

故:在xxhdpi类型(480dpi)上125.98dp换算出来的px值是:378px.在480dpi的设备上,这显示效果就是20mm

现在在小米5(428dpi)上,显示378px的效果就肯定不是20mm,而是比20mm要长一些

因为 在小米5上要显示20mm,实际只需要的px值=(428px/inch)/(25.4mm/inch)*20mm=337px(UI上使用"mm"时就是这样使用真实dpi换算),小于上述的378px



那为什么不直接用"mm","in"呢?用这些就直接使用设备上的真实的dpi来得到精确的显示效果啊

从资料中说的有三点用意:

1.减少计算量.显示时换算px时只有简单的0.75,1.00,1.50,2.00,300,... 将会减少舍入取整的次数和减少运算量;

2.使得按比例显示各适配屏幕密度的图片(对应drawable-*之类);

3.当缩放图行的时候,最好保持接近整数和简单的分数,因为复杂的分数会导致图片颜色过渡异常和走样


另外根据在Android Studio上使用"mm"或"in"提示的不建议使用说明中大致意思是:

许多设备没有向系统提供准确的屏幕密度值,导致转换出来的px值也是不准确的

在小米5上测试了一下使用"mm"单位,用尺子测了一下出来的效果是精准的,估计他指的"许多设备"或许是旧的那些或是一些非手机的终端机吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值