android中UI布局中常用dip/dp,因为据sdk文档和各种资料所说“使用dp这样的长度单位可以兼容不同density的屏幕”——但是对这句话的理解直到今天才算真正搞明白是什么含义,惭愧至极,特此blog记录。下面的列表针对如下的一个layout布局的x水平方向,共列出多种情况来分析dp、px和视觉感官之间的关系:
dp与px的换算关系为:px = (density/160)dp
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="250dp"
android:layout_height="100dp" android:background="@android:color/white">
</LinearLayout>
dpi dp px x-total x-inch 视觉比例 物理长度
160 100 100 320 2-inch 0.3125 0.625 inch
240 100 150 480 2-inch 0.3125 0.625 inch
120 100 75 240 2-inch 0.3125 0.625 inch
120 100 75 480 4-inch 0.15625 0.625 inch
192 100 120 768 4-inch 0.15625 0.625 inch
192 100 120 800 4.16-inch 0.15 0.625 inch
结论:px和dp的换算公式实际反映的屏幕物理尺寸因为物理密度的不同而产生的变化,dpi、x-total和x-inch三者之间是紧密相关的,三者中若其一保持不变,则另外二者必然同步变化,根据这样的变化分类,所谓的dp与屏幕density无关,有两层次含义:
1、指的是在相同物理尺寸下(例如同为4-inch,或同为2-inch),dp值相同的UI组件在不同物理密度density的屏幕上将会给予人眼相同的视觉比例感官。例如上表中同为物理长度4-inch,但密度分别为120和192的两个屏幕中,具有100dp长度的UI部件在水平方向上给予人的视觉比例感官同为15.625%
2、在不同物理尺寸下(例如一个屏幕4-inch,一个屏幕2-inch),dp值相同的UI组件在不同物理密度density的屏幕上将会占据同样的物理尺寸,例如上表中所有的UI部件均为100dp,无论dpi是多少,也无论x-inch是多少,占据的物理长度始终为0.625inch。但是在这种情况下,UI部件在各个屏幕上给予人的视觉比例感官则是不同的,之前本人遇到这样的情况时就会疑惑dp与屏幕兼容性的关系。
所以,在设置模拟器参数,以及ADT插件中的layout预览视图配置时,应该根据上述的关联情况进行正确的设置,才能够使模拟器和预览界面中的Ui布局给人的视觉感官相同