对于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"单位,用尺子测了一下出来的效果是精准的,估计他指的"许多设备"或许是旧的那些或是一些非手机的终端机吧