前一天学习了ImageView控件切换显示图像、设置图像透明度以及显示局部的方法。通过setImageBitmap()方法可以快速没有停顿地将图像在控件中显示;通过setAlpha()方法设置图像的透明度;通过为ImageView控件添加触摸事件监听器的方法实现位图的局部显示。

在前面的学习中,通过界面构造文件设置控件尺寸时,可以将其宽度或高度设置为“wrap_content”、“match_parent”等值,也可以将其设置为固定的值,如

button.layout_width = “120px”

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的设备。

android java 设置控件的样式 java设置控件大小_安卓编程

图2-1 分辨率为240*320的设备

android java 设置控件的样式 java设置控件大小_安卓编程_02

图2-2 分辨率为480*800的设备

而使用pt作为控件尺寸的单位也存在类似问题,对于不同尺寸的设备,其显示的大小是不同的。

3 与设备无关的单位dp

在1中提到,dp的含义是与设备无关。使用dp作为控件尺寸的长度,可以使得控件在不同的分辨率下,显示的大小是相同的,如图3-1和3-2所示。其中,图3-1是分辨率为240*320的设备,图3-2是分辨率为480*800的设备。

android java 设置控件的样式 java设置控件大小_px_03

图3-1分辨率为240*320的设备

android java 设置控件的样式 java设置控件大小_sp_04

图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分辨率的设备。

android java 设置控件的样式 java设置控件大小_dp_05

图4-1 分辨率为240*320的设备

android java 设置控件的样式 java设置控件大小_安卓编程_06

图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等字段。