Density-independent pixel (dp)独立像素密度。标准是160dip.即1dp对应1个pixel,计算公式如:px = dp * (dpi / 160),屏幕密度越大,1dp对应 的像素点越多。
上面的公式中有个dpi,dpi为DPI是Dots Per Inch(每英寸所打印的点数),也就是当设备的dpi为160的时候1px=1dp;
好了,上述这些概念记不记得住没关系,只要记住一点dp是与像素无关的,在实际使用中1dp大约等于1/160inch。
1,Android屏幕大小
Android将屏幕分为四种大小:small,normal,large,xlarge
区分:对设备的对角线用尺子量一下,用英寸做单位进行区分,比如4.7英寸,属于normal,具体分类如图1所示:
图1 android屏幕大小区分
2 屏幕的分辨率和密度
分辨率(Resolution):The total number of physical pixels on a screen. 即一个设备的物理像素,如1280*720,大家可以自己计算。
密度(Screen density):The quantity of pixels within a physical area of the screen; usually referred to as dpi (dots per inch).一般我们的密度的单位是像素数目/平方英寸,但是这里推荐了一个新的密度表示方法,就是每英寸的像素数目(dpi)。我们以后用到的密度就是这个dpi。
设备1的输出是:
从两个设备的输出可以知道,其实是定义了两个4.7英寸的avd,但是有着不同的分辨率,(android里有底部栏,看起来有点不一样),这两个例子说明了一个问题:相同大小的手机,可以有不同的分辨率,进而就有不同的密度,(因为密度=分辨率/大小)。
3 程序判断屏幕大小
如何判定大小(设备的真实尺寸,可以理解为设备对角线的英寸数)呢,就根据2所提到的两个参数来判断,一个是分辨率,一个是密度,用设备1而言,知道height是1184像素(px),其密度为320dpi(像素/英寸),则高度的具体值就是1280/320=4(英寸),宽度为800/320=2.5 ,用勾股定理算出对角线的长度,再和图1匹配,得到这个设备的屏幕大小尺寸。
屏幕大小判定之后,首先需要在mainfest声明支持的屏幕大小,如:
1
|
< supports-screens android:largeScreens = "true" />
|
5 dp的应用与图片问题
通过3的描述,我们应该可以知道,在layout里任何的控件都采用dp就可以保证显示一致的问题了。这也是google所推荐的。
但是对于图片这种外来户,我们可以规定它在layout中的大小,假如我们规定了图片的宽度1英寸(可以转为dp,后面会将),对于一张图片,其真实的宽度为15像素,在密度为3dpi的屏幕中,可以显示3个像素,这时需要丢掉12个像素,图片一定极为不清晰;在密度为15dpi的屏幕里可以显示15个像素,显示完全。这就有了分辨率的问题,在宽度都为1英寸的情况下,肯定是能够显示全部15个像素的图片清晰,怎么能让不同密度的屏幕显示的照片都比较清晰呢,我们可以对不同密度的屏幕选择不同的图片,即高密度选择高清图片。对于任何一张图片,我们都可以做三张,一张低分辨率,一张高分辨率,一张中间值,对于高密度的屏幕,比如密度为15,我们选择一张分辨率较高的图片(就是大的图片),如15英寸的,对于密度为3的,我们让它显示一张分辨率为3的,则保证了不会丢失信息,从而保证图片清晰。
对于不同密度的屏幕,可以通过/res/drawable-hdpi等进行选择图片。这个官网也有。
6 dp的计算