Diferencia entre la dimensión android: pt y dp

La documentación dice que 160 dp (independiente de la densidad) es igual a 1 pulgada. Y 72 pt es también 1 pulgada. Así que no veo por qué android definir una medida de dp, mientras que parece que funciona lo mismo que los puntos. ¿Alguien puede explicar eso? ¿Por qué debo usar dp si puedo usar pt?

    7 Solutions collect form web for “Diferencia entre la dimensión android: pt y dp”

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

    De la documentación actualizada:

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

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

    La documentación de Android para esto está aquí .

    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:

    Prueba de tipo de recurso HTC Aria

    Es interesante observar que estos tamaños no coinciden exactamente en el editor gráfico de eclipse. Los tamaños dp y sp vacilaron dependiendo del tamaño de la pantalla y la resolución en el editor. Aquí hay algunas capturas de pantalla del editor (izquierda es 2.7in QVGA deslizante, derecho es 10.1in WXGA, recortado):

    Introduzca aquí la descripción de la imagen

    Sería interesante ver si estos renderizadores de editor coinciden con los dispositivos reales. ¿Puede alguien 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> 

    Edit: 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.

    Samsung Nexus SSamsung Galaxy Tab 10.1

    En el Nexus S, 160dp es ligeramente mayor que 1 pulgada. Todas las unidades físicas normales (en, mm, pt) son 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 que deberían.

    En la lengüeta, todas las barras son exactamente iguales, y 1m m más que lo que mido con una regla.

    La documentación dice que 160 dp (independiente de la densidad) es igual a 1 pulgada. Y 72 pt es también 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 pantalla del dispositivo.


    Un único dp es un único px en un dispositivo a 160 ppp. Android utiliza 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 único pt es exactamente 1/72 de pulgada en cualquier densidad de pantalla. Android convierte pt a px usando el dpi exacto (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 definir una medida de dp, mientras que parece que funciona lo mismo que los puntos. ¿Alguien puede explicar eso? ¿Por qué debo usar dp si puedo usar pt?

    Tomemos un ejemplo, muestra 160 dp y 72 pt en un dispositivo de 160 ppp. Un dispositivo de 160 dpi cae en la cubeta de densidad de mdpi, con un escalador de 1,0. Utilice las fórmulas anteriores para convertir a px .

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

    ¿Qué pasa con un dispositivo de 170 ppp? Un dispositivo de 170 dpi cae en el cubo de densidad de 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 ppp? Un dispositivo de 150 dpi cae en el cubo de densidad de 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, 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 lleva a una cantidad diferente de px se utiliza, lo que puede obstaculizar el rendimiento y causar aliasing y artefactos si se utiliza en las imágenes. dp se recomienda a menos que se requieran dimensiones físicas absolutamente exactas (tiene una regla en la pantalla, etc).

    He escrito un blog en profundidad en unidades de dimensión de Android, lo que da más información y código de ejemplo – Entender la independencia de densidad en Android

    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):

    Transformador

    Y Leyenda:

    Leyenda

    He luchado con las dimensiones, pero creo que he encontrado una forma de ver que tiene sentido para mí. Hay una fórmula de conversión en Wei-Meng Lee "Principio Android 4 Application Development" (pg 111):

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

    Por lo tanto, utilizando esa fórmula, puedo encontrar qué dpi para mi teléfono / emulador es más cercano a uno de esos cuatro valores y que va a determinar la relación (3/4, 1, 3/2 o 2) utilizado en la fórmula para convertir Dp a píxeles. Es importante para mí que dpi en la fórmula sólo puede asumir uno de esos cuatro valores a pesar de la densidad de píxeles del dispositivo real.

    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 dpi la conversión es:

    Pixels = dp * 3/2

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

    Para una leyenda HTC, con una densidad de píxeles de 181 dpi la fórmula es:

    Pixels = dp * 1

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

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

    Estos son los dos puntos principales que estoy tratando de obtener en mi cabeza 🙂

    1. Un intervalo de densidades de píxeles reales del dispositivo (por ejemplo: 141 – 199) dará como resultado 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 es exactamente 160 ppp, el 160 dp no será una pulgada en el dispositivo … cerrar por encima o por debajo, pero no exactamente

    Pt Puntos – 1/72 de pulgada basado en 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 relación de dp a pixel cambiará con la densidad de pantalla, pero no necesariamente en proporción directa. Nota: El compilador acepta "dip" y "dp", aunque "dp" es más consistente con "sp".

    ¿Por qué debo usar dp si puedo usar pt?

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

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

    Esto no es cierto como lo muestra su aplicación … De acuerdo?

    BR STeN

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.