Como todo el mundo sabe, si una aplicación quiere adaptarse a tantos teléfonos móviles como sea posible, utilizará dp en lugar de px al escribir archivos de diseño. Si encuentra un manejo especial, escríbalo en la carpeta especificada (por ejemplo: valores-sw600dp, valores -sw720dp-land) en el archivo dimensiones.xml a continuación, pero específico al tamaño de 1dp que se puede mostrar en la pantalla, el tamaño de una imagen de 100 * 100px se puede mostrar en diferentes carpetas (drawable-xhdpi, drawable-xxhdpi), cuánto la memoria que ocupa puede ser relativamente vaga, este artículo hablará sobre la relación entre ellos

concepto


Antes de averiguar su relación, veamos primero el concepto de estos nombres.

Resolución

El número de píxeles que pueden caber en la pantalla de un teléfono móvil.
Por ejemplo, 1080 * 1920 (comúnmente conocido como 1080p) significa que puede acomodar 1080 píxeles en la dirección horizontal y 1920 píxeles en la dirección vertical.

ppp

Es la abreviatura de puntos por pulgada, que se traduce en el número de puntos por pulgada (pulgada). Ven a regalar una castaña

Cuando AVD.png
crea el simulador en AS, aparecerá la imagen de arriba para seleccionar el dispositivo.
Entre ellos, Tamaño se refiere a la longitud de la diagonal del teléfono móvil, la unidad es pulgadas ("), por ejemplo, Nexus5, los píxeles en la diagonal son: sqrt (1080  1080 + 1920  1920) = 2202,907, luego cada pulgada en la diagonal, algún punto de píxel es: 2202.907 / 4.95 = 445.03, 445.03 que nexus5 el ppp es un poco?  no realmente, pero también .
de hecho nexus5 el ppp es 445.03, pero cuando se usa en Android se basará en el siguiente rango de criterios para
support_dpi. png
para que nexus5 se muestre como xxhdpi (480dpi)

Cada densidad general cubre el rango de densidad, es decir, 2 teléfonos móviles con 480 ppp, el ppp real puede ser diferente.

actual_density.png

dp

所有的android开发在定义长宽的时候都在使用dp,那么dp到底是什么呢?
要讲清楚这个还得从android历史开始。
第一代 Android 设备 (T-Mobile G1) 的屏幕是采用的HVGA 屏幕(在 Android 1.6 之前,这是 Android 支持的唯一屏幕配置),这个屏幕上1dp=1px,并且是被归为mdpi类型,从此,这个就成为了android的最初始标准。随着不同厂商的加入,越来越多的不同dpi设备出现,于是有了下面这个标准

ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi
0.75px 1px 1.5px 2px 3px 4px

这是怎么来的呢?以xxhdpi来说,因为xxhdpi是归为480dpi的一类设备,是原始标准160dpi的2.5倍,所以1dp就对应2.5px

T-Mobile G1的硬件参数如下:
屏幕尺寸:3.2 寸(8.1 厘米)
分辨率:320 x 480(HVGA)
计算出dpi = 180.27,所以归为mdpi类

显示大小

就是一个view显示在屏幕上有多大,这个没什么好说的.

小结


要记住上面的关系可能很难,还好可以通过代码来获取值,我们只要记住这几个值是什么意思就可以了。
先来看如何获取dpi

float dpi = context.getResources().
                      getDisplayMetrics().densityDpi;

这个值就会是160.0 240.0 320.0这些值.
那如何获取1dp对应着多少px呢?可以通过如下方式

float scale = context.getResources().
                        getDisplayMetrics().density;

这个值就是0.75 1.0 1.5这些值。
比如在hdpi上,1dp=1.5px,但这其实是占有2个像素的。所以在真正编码的时候会用以下方式来做转换

// The gesture threshold expressed in dp (定义的16dp的值)
private static final float GESTURE_THRESHOLD_DP = 16.0f;
// Get the screen's density scalefinal (获取缩放比例)
 float scale = getResources().density;
// Convert the dps to pixels, based on density scale (定义的值 * 比例 + 0.5f)
mGestureThreshold = (int) (GESTURE_THRESHOLD_DP * scale + 0.5f);

这里加0.5是为了将该数字四舍五入到最接近的整数。

显示大小


那么,同一张图,在不同的文件夹,同一个手机上会有什么表现呢?
以一个144*144px的icon图标(放在drawable-xxxhdpi目录下),在xxhdpi密度的手机为例。用如下代码进行测试

//imageView都是wrap_content属性, src=144*144px的icon图标
ImageView imageView = (ImageView)findViewById(R.id.img);
imageView.post(new Runnable() {
      @Override
      public void run() {
          Log.i("hly", "img: " + imageView.getWidth() + " " + imageView.getHeight());
      }
 });

这里直接给出答案: 108px 【144 * (480 / 640)】
根据该文可以得出,计算公式是:

最终显示像素 = 原始像素 * (显示设备dpi / 放置文件夹对应dpi)

这也就是如果对应文件夹里面没有图片的时候,显示默认图片大小不一致的原因。

总结


也没啥好总结的了,想要熟悉这些关系,需要先记住基准尺寸mdpi- 160dpi。
以上