px(像素),通俗地说就是屏幕中的点,它是最基本的显示单位。
这里模拟几个场景:
手机1、手机分辨率是480*800(mdip),尺寸为:宽3英寸、高5英寸
那么此时,1英寸=160px
手机2、手机分辨率是720*1200(hdip),尺寸为:宽3英寸、高5英寸
那么此时,1英寸=240px=160px*1.5
手机3、手机分辨率是960*1600(xhdip),尺寸为:宽3英寸、高5英寸
那么此时,1英寸=320px=160px*2
现在有一个layout.xml布局文件,布局中有一个TextView,设置其宽为160px。请问:在上面三台手机上显示出来的TextView实际的宽是多少?
答案显而易见,手机1:1英寸;手机2:2/3英寸;手机3:1/2英寸
总结:如果采用px作为界面上控件的宽高单位,那么不同分辨率下显示出来的实际大小也会不同。这样的用户体验相当不好。
我们希望的是即使在不同分辨率下,控件仍然能有其正常的宽高。
Android给我们提供了一个绝对的长度单位——dip。
dip——device independent pixel(设备独立像素)。Android规定,无论在何种分辨率下,160dip=1英寸。
因此,给TextView设置宽为160dp,在上面三台手机上显示的效果为:
手机1:1英寸; (1dp=1px)
手机2:1.5英寸; (1dp=1.5px)
手机3:2英寸 (1dp=2px)
此外,我们可以在虚拟机上的顶部栏看到240dpi。dpi——dots per inch(意思是每英寸有多少像素)。由上面的三个场景可以知道这台手机(虚拟机)是hdip(高分辨率)。
如果我们想在java代码中设置控件的宽高,那么这时我们需要动态获取当前手机dp和px的比值
float scale = getResources.getDisplayMetrics.density;
然后用比值乘以160,就得到我们要设置的宽高。
int height = (int)(scale * 160 + 0.5);
int width = (int)(scale * 160 + 0.5);
LinearLayout.LayoutParams params = LinearLayout.LayoutParams(width,height);
textView.setLayoutParams(params);