¿SetWidth (int píxeles) usa dip o px?

Respuestas:

221

Utiliza píxeles, pero estoy seguro de que se está preguntando cómo utilizar las inmersiones. La respuesta está en TypedValue.applyDimension(). Aquí hay un ejemplo de cómo convertir dips a px en código:

// Converts 14 dip into its equivalent px
Resources r = getResources();
int px = Math.round(TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_DIP, 14,r.getDisplayMetrics()));
Dan Lew
fuente
64
También puede llamar a nbDips * getResources (). GetDisplayMetrics (). Densidad
Romain Guy
9
De hecho, eso es exactamente lo que hace TypedValue.applyDimension (). Consideré publicar eso, pero me gusta revisar la API en caso de que algo cambie ... aunque supongo que es seguro usar ese método si lo autoriza. :)
Dan Lew
12
La versión applyDimension () ejecuta más código y me resulta un poco más difícil de leer. FWIW, la línea que publiqué es lo que realmente usamos en todo el lugar en el marco y las aplicaciones estándar.
Romain Guy
1
Hola, probé los dos ejemplos anteriores y no parece calcular los píxeles correctamente. en su lugar, me devuelve el valor exacto que especifiqué en mi vista: android: layout_width = "50dip" en mi caso. me devolverá 50 el valor exacto en el archivo xml. Luego verifiqué esto en la aplicación y, como esperaba, el valor es incorrecto y dibuja la vista demasiado grande de lo esperado
Jonathan
La única solución que encontré para la conversión de px a pt, muy buena.
A-Live
24

La forma correcta de obtener un número constante de DIP en el código es crear un archivo XML de recursos que contenga valores dp un poco como:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="image_width">100dp</dimen>
    <dimen name="image_height">75dp</dimen>
</resources>

Luego, consulte el recurso en su código así:

float width = getResources().getDimension(R.dimen.image_width));
float height = getResources().getDimension(R.dimen.image_height));

El flotador que ha devuelto se escalará en consecuencia para la densidad de píxeles del dispositivo, por lo que no es necesario que siga replicando un método de conversión en toda su aplicación.

SDJMcHattie
fuente
En mi situación, esta solución funciona mejor cuando tengo un cuadro de diálogo personalizado que tiene una vista de lista y deseo establecer el ancho de las etiquetas de encabezado y las columnas en ListView con el mismo ancho.
Wayne Phipps
Tu primera oración es un poco divertida, básicamente estás diciendo que crear un archivo XML es la forma correcta de "especificar [algo] en el código" . Bueno, creo que simplemente estás usando la constante en el código sin especificarlo :)
Joffrey
@Joffrey, sí, veo lo que quieres decir, así que actualicé un poco la redacción
SDJMcHattie
7

Método setWidth (100), establezca 100 px como ancho (no en dp). Por lo tanto, puede enfrentar problemas de ancho variable en diferentes teléfonos Android. Por lo tanto, use la medición en dp en lugar de píxeles. Utilice el siguiente código para obtener la medición en dp del ancho de la muestra = 300px y altura = 400px.

int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, getResources().getDisplayMetrics());

int Height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 400, getResources().getDisplayMetrics());
Nidhin
fuente
0

Píxeles, por supuesto, el método solicita píxeles como parámetro.

Josnidhin
fuente
1
Si está en un archivo xml de diseño, podemos especificar android: layout_width = "100dip" o android: layout_width = "100px". En el código fuente, ¿no podemos especificar el ancho de un diseño como 100dip?
user256239
No directamente, tienes que convertirte usando DisplayMetrics.density.
Romain Guy
0

Según las respuestas anteriores que me funcionan bien, genero algunos métodos de ayuda , solo agrégalos en tus utilidades para usarlos en todo el proyecto.

   // value in DP
   public static int getValueInDP(Context context, int value){
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
    }

    public static float getValueInDP(Context context, float value){
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
    }

    // value in PX
    public static int getValueInPixel(Context context, int value){
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
    }

    public static float getValueInPixel(Context context, float value){
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
    }
Abhishek Garg
fuente