2011-09-13 18 views
12

Estoy leyendo este artículo: http://developer.android.com/guide/practices/screens_support.htmlAndroid: conversión 'dp' a 'px'?

Se dice que la fórmula Android utiliza para convertir entre una unidad dp a una unidad px es la siguiente:

px = dp * (dpi/160) 

El artículo también da una ejemplo cuando el dpi es 240, que nos da px = 1.5 (estoy calculando para un solo píxel dp)

Sin embargo, ¿qué significa exactamente 1.5 aquí? Una vez que las unidades px sean en realidad los píxeles del dispositivo físico, ¿sacará Android 1 o 2 píxeles?

Respuesta

15

Depende del contexto.

Si se utiliza el valordp en un contexto que implica tamaño, como el atributo android:layout_width, se utilizará la lógica descrita para Resources.getDimensionPixelSize(). Es decir, el valor px se redondeará al valor entero más cercano, con el caso especial de que si px> 0, entonces el valor real será al menos 1.

Si el valorDP se utiliza en un contexto que implica compensación, como el atributo android:insetLeft de Inset Drawable, se utilizará la lógica descrita para Resources.getDimensionPixelOffset(). Es decir, el valor px simplemente se truncará en un valor entero.

A veces se utiliza el valor de punto flotante no modificado, como para el atributo android:dashWidth de la etiqueta <stroke/> en Forma de dibujo, pero esto es bastante raro. Por lo general, se usa el tamaño o la lógica de compensación, incluso si se puede usar el valor del punto flotante.

+0

Humm, ¡eso es lo que estaba buscando! Me pregunto por qué la documentación no muestra esto ... ¡Muchas gracias, Martin! –

2

Si lo que he leído es correcto, 1.5px significa que el único '1' píxel es un color especificado, y el .5 de un píxel que lo rodea será una mezcla con el '1' píxel y un píxel próximo lo.

E.g.

| A | AB | B |

A es 1.5px y B es 1.5x, por lo tanto, el píxel intermedio es una mezcla de ambos.

lo que el uso que, dos píxeles lado de la otra se mezclan por ejemplo con una pantalla de 1px

| X | Y |

Ahora con una pantalla de 1.5px:

| XY | YX | ¡Se convierte en una mezcla de ambos! pero el píxel establecido como X será más X que el píxel establecido como Y

+0

Eso es interesante, pero creo que no es lo que dice el artículo. No dice nada sobre los colores en absoluto. Supongo que simplemente se olvidó de decir lo que realmente significa 1.5. Odio decir esto, pero aquí es donde amo a Apple. ¡Su documentación es mucho más precisa! –

+0

Oh, no lo leí de los documentos de Android. Es una característica común de muchos SO modernos y otras aplicaciones. E.g.typefaces puede ser 1.5px en la web, y con bastante frecuencia. El navegador calcula algo similar a lo que describí. – Micky

1

px es de un píxel. píxeles independientes de la escala (sp) y píxeles independientes de la densidad (inmersión) que desea utilizar sp para tamaños de fuente y dip para todo lo demás.

inmersión == dp

de aquí http://developer.android.com/guide/topics/resources/more-resources.html#Dimension

px 
Pixels - corresponds to actual pixels on the screen. 

in 
Inches - based on the physical size of the screen. 

mm 
Millimeters - based on the physical size of the screen. 

pt 
Points - 1/72 of an inch based on the physical size of the screen. 

dp 
Density-independent Pixels - an abstract unit that is based on the physical density of the screen. These units are relative to a 160 dpi screen, so one dp is one pixel on a 160 dpi screen. The ratio of dp-to-pixel will change with the screen density, but not necessarily in direct proportion. Note: The compiler accepts both "dip" and "dp", though "dp" is more consistent with "sp". 

sp 
Scale-independent Pixels - this is like the dp unit, but it is also scaled by the user's font size preference. It is recommend you use this unit when specifying font sizes, so they will be adjusted for both the screen density and user's preference. 
0

creo que sería la mejor solución porque es un método estándar:

int valueInPx = (int) TypedValue.applyDimension ( TypedValue.COMPLEX_UNIT_PX, valueInDp, getResources(). GetDisplayMetrics());