android 单位总结

dip或dp,(device independent pixels,设备独立像素),一般为了支持WVGA、HVGA和QVGA使用这个,不依赖像素。
  这里要特别注意dip与屏幕密度有关,而屏幕密度又与具体的硬件有关,硬件设置不正确,有可能导致dip不能正常显示。在屏幕密度为160的显示屏上,1dip=1px,有时候可能你的屏幕分辨率很大如480*800,但是屏幕密度没有正确设置比如说还是160,那么这个时候凡是使用dip的都会显示异常,基本都是显示过小。
  dip的换算:dip(value)=(int) (px(value)/1.5 + 0.5)

图片的DPI(Dot Per Inch的缩写)一般是指每英寸的像素,类似于密度,即每英寸图片上的像素点数量,用来表示图片的清晰度。 参考wiki百科,应该是每英寸长度上面点的个数,而不是每平方英寸上点的个数。百度百科有误。

分辨率(resolution,港台称之为解析度)就是屏幕图像的精密度,是指显示器所能显示的像素的多少。由于屏幕上的点、线和面都是由像素组成的,显示器可显示的像素越多,画面就越精细,同样的屏幕区域内能显示的信息也越多,所以分辨率是个非常重要的性能指标之一。可以把整个图像想象成是一个大型的棋盘,而分辨率的表示方式就是所有经线和纬线交叉点的数目。


dpi = widthPixels/with 即 像素宽度/物理宽度

dip/pixel = 160/dpi

屏幕密度density = dpi/160;故也有dip=pixel/density;

density = context.getResource().getDisplayMetrics().density;

sp(与刻度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。

in(英寸):长度单位。

mm(毫米):长度单位。

pt(磅):1/72英寸。

补充:

/**
* The logical density of the display. This is a scaling factor for the
* Density Independent Pixel unit, where one DIP is one pixel on an
* approximately 160 dpi screen (for example a 240x320, 1.5"x2" screen),
* providing the baseline of the system's display. Thus on a 160dpi screen
* this density value will be 1; on a 120 dpi screen it would be .75; etc.
*
* <p>This value does not exactly follow the real screen size (as given by
* {@link #xdpi} and {@link #ydpi}, but rather is used to scale the size of
* the overall UI in steps based on gross changes in the display dpi. For
* example, a 240x320 screen will have a density of 1 even if its width is
* 1.8", 1.3", etc. However, if the screen resolution is increased to
* 320x480 but the screen size remained 1.5"x2" then the density would be
* increased (probably to 1.5).
*
* @see #DENSITY_DEFAULT
*/
public float density;

标准DPI 为160, 即1”(1英寸)160个px;
density为逻辑密度, 即 density = 设备A的DIP / 160; 例如:
某设备A 240* 320, 物理尺寸为1.5”x2” ,其 density = 240 / 1.5 / 160 = 1 或者 density = 320 / 2 / 160 = 1
某设备B 320* 480, 物理尺寸为1.5”x2” ,其 density = 320 / 1.5 / 160 = 1.5 或者 density = 480 / 2 / 160 = 1.5

以上两种情况,水平方向和竖直方向密度一样即xdpi = ydpi;
同时也存在 xdpi != ydpi的情况,如:
240x320 物理像素的设备C,如果密度为1, 宽度为1.8",xdpi = 240 / 1.8 = 133.33,
这种情况,密度并不能简单的用 总物理像素 / 物理尺寸 / 标准DPI得到; 如设备C,我们得到的密度是0.833; 而当它的尺寸为1.3"的时候密度为1.15;
而我们提到设备C density = 1, 故density并不是完全follow真实的屏幕尺寸;
假设width = 1.8" density=1, height * (160 * density) * width * (160 * density) = 240 * 320 ==> height = 1.67" 即 xdpi = 133.33, ydpi = 191.62

总结:
(density * 160 * 宽度物理尺寸) * (density * 160 * 高度物理尺寸)= 宽度像素数 * 高度像素数 == 》 density ^2 = XDPI * YDIP / (160*160)
当xdpi = ydpi,即密度均匀的时候, density 计算公式可以直接使用 density = 宽度像素数 / 物理宽度 / 160 = XDPI / 160 = YDPI / 160

当xdpi != ydpi的时候,即密度不均匀的时候,就不能使用简化的公式计算

另外:DP表示设备无关像素 , 1DP = 1Px * density, 而根据上述设备C(1.8"x1.67")情况,1DP = 1px, 240DP = 240px 物理宽度为1.8", 而240DP物理高度为 1.67” * 240 / 320 = 1.25"
同样设备上的同样240DP,它们的物理尺寸却分别为1.8” 、1.25”, 相差30%。

原文地址:https://www.cnblogs.com/lipeil/p/2666770.html