android屏幕显示相关字段的理解

jopen 10年前

多个设备屏幕,不同设备有不同的density,dpi会随分辨率变化,dp比值也会变化。故网上大多数讲情景都是设备dp/px=dpi/160相同的2个设备上运行时一致的。但当同一个apk在2个比值不相同的设备上运行时,效果肯定有很大差异的。

一、字段

1.density(密度):描述设备屏幕一个区域内占用多少像素,不同的设备有不同的密度
2.dpi:dots per inch ,来表示某一英寸内的像素点。一个设备可能支持多个分辨率,density是出厂时物理密度,和inch一样是不变的,故dpi会根据像素变化
3.px(像素):屏幕基本单位
4.dp:Density-independent pixel根据设备的density的不同,计算后与px的比值为
px/dp=当前设备dpi/160
5.inch(英寸):屏幕对角线长度,1 inch = 2.54cm
6.resolution(分辨率):设备屏幕的总像素点

二、dp和px使用理解

网上看到大多数对dp理解文章,之前也非常笃信。后来实际开发中发现并不只如此。网上讲的大多只是初步一半的解释,仔细翻过api文档中的朋友会发现:

Supporting Multiple Screens


支持多个设备屏幕,不同设备有不同的density,dpi会随分辨率变化,dp比值也会变化。故网上大多数讲情景都是设备dp/px=dpi/160相同的2个设备上运行时一致的。但当同一个apk在2个比值不相同的设备上运行时,效果肯定有很大差异的。

应用开发都希望用一个apk能在所有的设备上正常显示,效果一致,不需要再做第2次无用开发。
相信实现过的人,都有不同的实现方式。
下面是作者基于同一个apk在不同设备上的情景分析。
1.在同一个设备上,可能支持不同分辨率,密度不变,dpi会变化:
dp作为单位:此时能自动适应当前设备不同分辨率,正常显示。并且只需要一个布局文件即可。
px作为单位:需要2套不同分辨率的布局文件

2.不同设备上,不同分辨率,不同密度:


dp作为单位:此时不一定能自动适应设备不同分辨率,当设备的dpi与之前正常显示的设备一直时,能正常显示。否则,同样需要2套dp的布局才能正常显示,见下图分析。



px作为单位:需要2套不同分辨率的布局文件


android屏幕显示相关字段的理解


三、总结:

在实际开发中,大多数还是用px作为基本单位,2套布局,1套高清资源。因为尽管各个厂家设备密度怎么变化,px永远是基本单位,并且增加一套布局并不是多么困难的事情。
在开发apk时,只要多增加1套px为单位的布局,让apk根据设备分辨率自动选择布局文件。当然用dp 2套布局也许可行,但大多数设备时并不是真正的720p或1080p,dp只是和px的一个比值,计算时肯定会有误差。2者对比,效果差距还是会有的。
dp和px两者都有优势劣势,px当有多少个分辨率时,就要有几套布局。相对较稳定,效果好。