2010-02-10 8 views
51

He descubierto que es posible establecer las dimensiones de mis elementos de la interfaz en diseños XML utilizando DIP como en el siguiente fragmento:¿Cuál es la forma correcta de especificar dimensiones en DIP a partir del código de Java?

android:layout_width="10dip" 

Pero todo interfaz Java toma de enteros como argumentos y no hay manera de especificar las dimensiones en los baños . ¿Cuál es la forma correcta de calcular esto?

Pensé que tenía que usar la densidad de la propiedad de la clase DisplayMetrics, pero ¿es esta la manera correcta?

¿Puedo confiar en que esta fórmula siempre es correcta?

píxeles * DisplayMetrics.density = dip

¿Hay una función de utilidad para la conversión en algún lugar de Android?

Respuesta

43

Esa es la fórmula correcta allí. Aunque DisplayMetrics.density no es un miembro estático, por lo que, de acuerdo con el same document you alluded to, uso correcto es:

// Maybe store this in a static field? 
final float SCALE = getContext().getResources().getDisplayMetrics().density; 

// Convert dips to pixels 
float valueDips = 16.0f; 
int valuePixels = (int)(valueDips * SCALE + 0.5f); // 0.5f for rounding 
+1

Gracias Roman, de alguna manera pasé por alto esta parte. Hay dos preguntas adicionales relacionadas con el tema: - ¿La densidad será siempre igual para ambas dimensiones? Parece que sí (ya que este es solo un valor), pero tal vez haya alguna otra fórmula para calcular esto. - ¿hay alguna API para hacer la conversión por mí? ¿Realmente tengo que escribir lo siguiente recortado en mi código?En el código de diseño XML, es posible especificar "dip" como unidad, ¿por qué no es posible en la API de Java? –

+1

Creo que puede suponer con seguridad que la densidad es igual en ambas dimensiones. Recuerde, DisplayMetrics.density es la ** densidad lógica **, no la densidad de pantalla real (que puede variar ligeramente de la densidad lógica). Con respecto a una API de conversión, es trivial escribir un método auxiliar como, por ejemplo, 'Util.dip' que convierte los dip's a píxeles para usarlos en llamadas a funciones. Es más limpio manejar unidades en Java de esa manera de todos modos. –

91

Hay un método de utilidad ya incorporadas llamada TypedValue.applyDimensions(int, float, DisplayMetrics) que hace esto.

Así es como se usa:

// returns the number of pixels for 123.4dip 
int value = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 
        (float) 123.4, getResources().getDisplayMetrics()); 

Hay una lista de otros tipos que se pueden utilizar con ella, incluyendo COMPLEX_UNIT_SP, COMPLEX_UNIT_PT todos se encuentran en la página he vinculado anteriormente. Si excluye el tipo de transmisión (int), obtendrá el número de coma flotante.

Me encontré con el mismo problema y lo encontré hurgando en el código.

+12

Esto convierte los píxeles en DIP en lugar de DIP en píxeles, que creo que es lo que el OP quería. Ciertamente era lo que yo quería. Que te gusta así: '(int) (desiredDIP * context.getResources(). GetDisplayMetrics(). Density)' – mxcl

9

Utilizando el campo de densidad de métricas de pantalla, puede obtener un factor de escala para convertir a/desde saltos. Utilice el método Math.round convertir de un flotador a un int sin necesidad de un yeso o una adición de 0,5

// Converting dips to pixels 
float dips = 20.0f; 
float scale = getContext().getResources().getDisplayMetrics().density; 
int pixels = Math.round(dips * scale); 

// Converting pixels to dips 
int pixels = 15; 
float scale = getContext().getResources().getDisplayMetrics().density; 
float dips = pixels/scale; 
+0

Math.round hace un cast. '(int) Math.floor (a + 0.5f)' es lo que Math.round hace bajo el capó. –

5

Creo que la mejor manera no es para definir las dimensiones de código, pero utilizar el archivo values/dimens.xml lugar. Siempre se puede definir su dimensión en la unidad deseada como:

<dimen name="my_layout_height">120dp</dimen> 

y luego tenerlo en cuenta en su actividad como:

getResources().getDimensions(R.dimen.my_layout_height); 

Esto volvería píxeles después de hacer las conversiones necesarias. Y también por supuesto puede referirse a esto en sus otros XML como:

android:layout_width="@dimen/my_layout_height" 
Cuestiones relacionadas