前一天学习了ImageView控件切换显示图像、设置图像透明度以及显示局部的方法。通过setImageBitmap()方法可以快速没有停顿地将图像在控件中显示;通过setAlpha()方法设置图像的透明度;通过为ImageView控件添加触摸事件监听器的方法实现位图的局部显示。
在前面的学习中,通过界面构造文件设置控件尺寸时,可以将其宽度或高度设置为“wrap_content”、“match_parent”等值,也可以将其设置为固定的值,如
button.layout_width = “160dp”
那么,指定控件尺寸时,px、pd这些单位的含义是什么呢?
在界面布局文件中指定控件尺寸时,可以使用px、pt、dp和sp等单位。
1 尺寸单位的含义
1.1 px
px是pixel的缩写,即像素。像素是屏幕中可以显示的最小元素单元。大家比较熟悉的设置电脑分辨率的1024*768指的就是屏幕宽度为1024个像素,高度为768个像素。以下代码
button.layout_width = “120px”
表示按键的宽度时120个像素。
1.2 pt
pt是point的缩写,即“点”。它是一个标准的长度单位,1pt=1/72英寸,一般用于印刷业。
1.3 dp
dp是density independent pixel的缩写,即“与密度无关的像素”,有时dp也会写成dip。“密度”的概念将在4.1中详细讲解。不同的设备其分辨率可能会不同,使用dp作为尺寸单位可以使得控件在不同设备上显示一样的大小。
1.4 sp
sp是scale independent pixel的缩写,即“与放缩无关的像素”。一般用于指定字体。
2 px和pt的局限性
在1中提到,px随着设备分别率的不同,会显示不同的尺寸。使用px作为尺寸单位的控件,在分辨率不同的设备中显示的大小是不同的,如图2-1和图2-2所示。其中,图2-1是分辨率为240*320的设备,图2-2是分辨率为480*800的设备。
图2-1 分辨率为240*320的设备
图2-2 分辨率为480*800的设备
而使用pt作为控件尺寸的单位也存在类似问题,对于不同尺寸的设备,其显示的大小是不同的。
3 与设备无关的单位dp
在1中提到,dp的含义是与设备无关。使用dp作为控件尺寸的长度,可以使得控件在不同的分辨率下,显示的大小是相同的,如图3-1和3-2所示。其中,图3-1是分辨率为240*320的设备,图3-2是分辨率为480*800的设备。
图3-1分辨率为240*320的设备
图3-2分辨率为480*800的设备
4 pt、dp和sp转换为px
pt的单位是英寸,px的单位是像素,那么英寸与像素之间是什么关系呢?这就要引入屏幕像素密度的概念了。
4.1 屏幕像素密度
屏幕像素密度指的是每英寸包含的像素数量,单位是dpi。查看设备屏幕像素分辨率的代码如下所示:
1 float xdpi =getResources().getDisplayMetrics().xdpi;
2 float ydpi =getResources().getDisplayMetrics().ydpi;
3 float density =getResources().getDisplayMetrics().density;
4 int default_density =
5 getResources().getDisplayMetrics().DENSITY_DEFAULT;
6 float scale_density =
7 getResources().getDisplayMetrics().scaledDensity;
8 Log.d("MainActivity","xdpi 是" + xdpi);
9 Log.d("MainActivity","ydpi 是" + ydpi);
10 Log.d("MainActivity","density 是" + density);
11 Log.d("MainActivity","scaleDensity 是" + scale_density);
12 Log.d("MainActivity","DENSITY_DEFAULT 是" + default_density);
其中,getResources()是Activity类的方法,获取应用程序包的资源实例,返回值是Resources类;getDisplayMetrics()是Resources类的方法,获取程序的显示信息,返回值是DisplayMetrics类。第1行和第2行中的xdpi和ydpi是DisplayMetrics类的字段,分别表示x轴和y轴方向每英尺的像素数;第3行中的density表示dp的放大因子,其值为xdpi/DENSITY_DEFAULT,DENSITY_DEFAULT是默认的密度值,为160,如第4-5行所示;第6-7行的scaledDensity是sp的放大因子;第8-12行通过调试信息显示获取到的五个值,如图4-1和图4-2所示。其中图4-1是240*320分辨率的设备,图4-2位480*800分辨率的设备。
图4-1 分辨率为240*320的设备
图4-2 分辨率为400*800的设备
4.2 pt转换为px
DisplayMetrics类的xdpi字段表示每英尺包含的像素数,而1pt等于1/72像素,所以1pt等于xdpi/72个像素。
4.3 dp转换为px
DisplayMetrics类的density字段是dp的放大因子,所以1dp等于density个像素。
4.4 sp转换为px
DisplayMetrics类的scaleDensity字段是sp的放大因子,所以1dp等于scaleDensity个像素。
5 小结
今天学习了表示控件尺寸时所使用的px、pt、dp和sp等单位。其中px表示像素,pt表示点,dp表示与密度无关的像素,sp表示放大因子像素。将pt、dp和sp转换px时,需要用到DisplayMetrics类的xdpi、density和scaleDensity等字段。