相关概念
- px(像素):显示器的图像是由一个个肉眼分辨不出的发光点构成的,这些发光点就叫做像素点(pixel)
- 分辨率:指的是显示器所能显示的像素有多少。如400*600,就是横向400个像素点,竖向600个像素点。所以在尺寸固定的情况下,分辨率越高,也就是单位面积内能显示的像素越多,图像就越清楚
- dpi:每英寸(2.54)上存在的像素数目。计算公式为:根号下(长的平方+宽的平方)除以屏幕尺寸。如400*600的屏幕,它的尺寸是4.5英寸,那么它的dpi就是160。
- dp(设备独立像素):dp本身不随着设备的改变而改变自身的大小。1dp是个绝对值,代表dpi为160时1个像素的点大小。如果dpi为320,那么1dp就等于2像素。
- density:代表屏幕密度,就是不同的屏幕1dp有几个像素。从以上的概念可推导出density=dpi/160
从以上概念可以推导px=dp * density。这就是这个公式的推导过程,及为什么除以160的原因。
屏幕适配
以2个屏幕,分辨率都是400*600为例,第一个屏幕dpi为160,第二个屏幕dpi为320。那么一个宽为200dp的控件,在屏幕1上刚好占横向位置的一半。但是在第二个屏幕上就会占满屏幕,因为第二个屏幕dpi是320,200dp=400像素。这就造成了相同的分辨率相同的dp显示出不同的效果。
那么让同一个控件,在不变形的情况下在不同的屏幕上,占比相同。如以上的例子,第一个屏幕横屏占满,那么第二个屏幕横屏也要占满。那么根据公式px=dp * density,dp一定的情况下,第二个屏幕占用的像素多少要改变,只能修改density。Android系统提供了getResources().getDisplayMetrics().density,可以对density进行修改,完成横向的适配。再根据宽高比,对高进行适配。