studio sizes entre diferencias convertir android measurement dimension

sizes - Diferencia entre la dimensión de Android: pt y dp



dp to px android (7)

La documentación dice que 160 dp (densidad independiente) es igual a 1 pulgada. Y 72 pt es también de 1 pulgada. Así que no veo por qué Android define una medida dp mientras parece funcionar igual que los puntos. ¿Alguien puede explicar eso? ¿Por qué debería usar dp si puedo usar pt?


¿Por qué debería usar dp si puedo usar pt?

Los desarrolladores están acostumbrados a pensar las cosas en términos de píxeles. Los píxeles independientes de la densidad era la forma de Android de acercarse a lo que los desarrolladores están acostumbrados. Dicho esto, puedes usar puntos, pulgadas o milímetros, si lo prefieres.


La documentación dice que 160 dp (densidad independiente) es igual a 1 pulgada. Y 72 pt es también de 1 pulgada.

El matiz aquí es que 160 dp (o dip ) es aproximadamente 1 pulgada, mientras que 72 pt es exactamente 1 pulgada. La diferencia es cómo Android convierte ambas unidades en píxeles, lo que depende de la densidad de la pantalla del dispositivo.

Un solo dp es un solo px en un dispositivo a 160 ppp. Android usa el "cubo de densidad" en el que cae el dispositivo y multiplica un escalador para convertir dp a px .

Bucket | DPI | Scaler --------------------- ldpi | 120 | 0.75 mdpi | 160 | 1.00 tvdpi | 213 | 1.33 hdpi | 240 | 1.50 xhdpi | 320 | 2.00 xxhdpi | 480 | 3.00

dp a px convierte siguiendo esta fórmula: dp * scaler = px .

Un solo punto es exactamente 1/72 de pulgada en cualquier densidad de pantalla. Android convierte pt a px utilizando los ppp exactos (xdpi y ydpi) de la pantalla del dispositivo.

pt a px convierte siguiendo esta fórmula: pt / 72 * dpi = px .

Así que no veo por qué Android define una medida dp mientras parece funcionar igual que los puntos. ¿Alguien puede explicar eso? ¿Por qué debería usar dp si puedo usar pt?

Tome un ejemplo, muestre 160 dp y 72 pt en un dispositivo de 160 ppp. Un dispositivo de 160 ppp cae en el cubo de densidad mdpi, con un escalador de 1.0. Usa las fórmulas de arriba para convertir a px .

160 dp * 1.0 = 160 px 72 pt / 72 * 160 = 160 px

¿Qué pasa con un dispositivo de 170 dpi? Un dispositivo de 170 ppp cae en el cubo de densidad mdpi, con un escalador de 1.0.

160 dp * 1.0 = 160 px 72 pt / 72 * 170 = 170 px

¿Qué pasa con un dispositivo de 150 dpi? Un dispositivo de 150 ppp cae en el cubo de densidad mdpi, con un escalador de 1.0.

160 dp * 1.0 = 160 px 72 pt / 72 * 150 = 150 px

La moraleja de la historia es que dp mantiene las dimensiones exactas y ayuda a mantener el rendimiento, permitiendo algunas variaciones de tamaño físico dependiendo de la densidad del dispositivo. Por otro lado, pt es exactamente el mismo tamaño físico en cada densidad, lo que conduce a una cantidad diferente de px está utilizando, lo que puede dificultar el rendimiento y causar aliasing y artefactos si se usa en las imágenes. Se recomienda dp menos que se requieran dimensiones físicas absolutamente exactas (tiene una regla en la pantalla, etc.).

He escrito un blog en profundidad sobre las unidades de dimensión de Android, que brinda más información y código de muestra. Comprender la independencia de densidad en Android


He luchado con las dimensiones, pero creo que he encontrado una forma de verlo que tiene sentido para mí. Hay una fórmula de conversión en "Desarrollo de aplicaciones para Android 4 principiantes" de Wei-Meng Lee (pág. 111):

Píxeles reales = dp * (ppp / 160), donde ppp es 120, 160, 240 o 320

Entonces, al usar esa fórmula, puedo encontrar qué dpi para mi teléfono / emulador es el más cercano a uno de esos cuatro valores y eso determinará la relación (3/4, 1, 3/2 o 2) utilizada en la fórmula para convertir dp a píxeles. Para mí, es importante que los ppp en la fórmula solo puedan asumir uno de esos cuatro valores a pesar de la densidad real de píxeles del dispositivo.

Refiriéndose a: http://en.wikipedia.org/wiki/List_of_displays_by_pixel_density , para un Nexus S con una densidad de píxeles de 235 ppp, la conversión es:

píxeles = dp * 3/2

Así que un botón de 160dp, digamos, sería 240px (un poco más ancho que una pulgada con los 235 dpi del dispositivo)

Para un HTC Legend, con una densidad de píxeles de 181 ppp, la fórmula es:

píxeles = dp * 1

(porque 181 es el más cercano a 160). De modo que el botón de 160dp sería de 160 píxeles, o un poco menos de una pulgada en el dispositivo con su densidad de píxeles de 181dpi.

Esto me ayuda a comprender lo incorrecto de la documentación anterior de Android "1 dp siempre será igual a 1 / 160in, independientemente de la densidad de la pantalla".

Estos son los dos puntos principales que estoy tratando de poner en mi cabeza :)

  1. un rango de densidades de píxeles reales del dispositivo (por ejemplo: 141-199) resultará en la misma proporción (1) en la fórmula de conversión
  2. pero a menos que la densidad de píxeles de un dispositivo en particular sea exactamente de 160 ppp, el 160 dp no será una pulgada en el dispositivo ... cerca o debajo, pero no exactamente

La documentación de Android utilizada para indicar incorrectamente que 160 dp siempre equivale a 1 pulgada independientemente de la densidad de la pantalla. Esto fue reportado como un bug que fue aceptado y la documentación actualizada.

De la documentación actualizada:

160 dp NO siempre será igual a 1 pulgada, variará con diferentes tamaños y densidades de pantalla. En una pantalla con una densidad de 160 ppp (mdpi), 160 pd será igual a 1 pulgada.

1 pt siempre será igual a 1/72 in, independientemente de la densidad de la pantalla.

La documentación de Android para esto está here .

ACTUALIZAR:

Hice una pequeña aplicación para probar y verificar los diferentes tamaños. Parece que lo que está arriba es correcto, al menos cuando se muestra en mi HTC Aria. Aquí hay una captura de pantalla:

Es interesante observar que estos tamaños NO coincidieron exactamente en el editor gráfico de eclipse. Los tamaños dp y sp fluctuaron dependiendo del tamaño de la pantalla y la resolución en el editor. Aquí hay algunas capturas de pantalla del editor (la izquierda es 2.7 en el control deslizante QVGA, la derecha es 10.1 en WXGA, recortada):

Sería interesante ver si estos editores coinciden con los dispositivos reales. ¿Alguien puede verificar estos tamaños? Adjuntaré mi xml a continuación en caso de que alguien quiera ayudar.

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:padding="5sp" android:text="160dp"></TextView> <View android:id="@+id/view1" android:layout_height="20dip" android:layout_width="160dp" android:layout_marginLeft="20sp" android:background="#FF22FF22"></View> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:padding="5sp" android:text="72pt"></TextView> <View android:id="@+id/view2" android:layout_height="20dip" android:layout_width="72pt" android:layout_marginLeft="20sp" android:background="#FF22FF22"></View> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:padding="5sp" android:text="1in"></TextView> <View android:id="@+id/View01" android:layout_height="20dip" android:layout_width="1in" android:layout_marginLeft="20sp" android:background="#FF22FF22"></View> <TextView android:layout_width="wrap_content" android:textSize="22sp" android:layout_height="wrap_content" android:text="160sp" android:padding="5sp" android:id="@+id/TextView01"></TextView> <View android:layout_marginLeft="20sp" android:layout_width="160sp" android:id="@+id/View04" android:background="#FF22FF22" android:layout_height="20dip"></View> <TextView android:layout_width="wrap_content" android:textSize="22sp" android:layout_height="wrap_content" android:padding="5sp" android:id="@+id/TextView02" android:text="160px"></TextView> <View android:layout_marginLeft="20sp" android:id="@+id/View03" android:background="#FF22FF22" android:layout_height="20dip" android:layout_width="160px"></View> <TextView android:id="@+id/textView4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:padding="5sp" android:text="25.4mm"></TextView> <View android:id="@+id/View02" android:layout_height="20dip" android:layout_marginLeft="20sp" android:background="#FF22FF22" android:layout_width="25.4mm"></View> </LinearLayout>

Edición: Se agregaron 2 dispositivos más al ejemplo de John. A la izquierda un Samsung Nexus S (OS 2.3.3). A la derecha, un Samsung Galaxy Tab 10.1 (OS 3.1). No hay mods.

En el Nexus S, 160dp es un poco más grande que 1 pulgada. Todas las unidades físicas normales (en, mm, pt) son todas del mismo tamaño. Lo medí con una regla y la barra de 160 dp es aproximadamente 1 mm más grande de lo que debería. Mientras que las unidades físicas son 1mm más cortas de lo que deberían.

En la pestaña, todas las barras son exactamente iguales, y 1 mm más largas de lo que medí con una regla.


Por curiosidad, probé el diseño de la respuesta de John en mis dos dispositivos: Asus Transformer (10.1 in) y HTC Legend (3.2 in). Los resultados fueron bastante interesantes:

Transformador (recortado):

Y Leyenda:


Puntos pt : 1/72 de pulgada según el tamaño físico de la pantalla.

dp Píxeles independientes de la densidad: una unidad abstracta que se basa en la densidad física de la pantalla. Estas unidades son relativas a una pantalla de 160 ppp, por lo que un dp es un píxel en una pantalla de 160 ppp. La proporción de dp a píxel cambiará con la densidad de la pantalla, pero no necesariamente en proporción directa. Nota: El compilador acepta tanto "dip" como "dp", aunque "dp" es más consistente con "sp".


1 dp siempre será igual a 1/160 in, independientemente de la densidad de la pantalla.

Esto no es cierto como se muestra en su solicitud ... ¿De acuerdo?

BR STeN