Android y configuración de anchura y altura mediante programación en unidades dp


Estoy haciendo:

button.setLayoutParams(new GridView.LayoutParams(65, 65));

De acuerdo con los documentos, las unidades para el ancho y el alto (ambos 65 en el anterior) son "píxeles". ¿Cómo obligas a que sean píxeles independientes del dispositivo, o "dp"?

Author: SK9, 2011-03-10

4 answers

Tendrás que convertirlo de dps a píxeles usando el factor de escala de visualización.

final float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scale + 0.5f);
 492
Author: Robby Pond,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-10 12:58:55

Sé que esta es una vieja pregunta, sin embargo, he encontrado una manera mucho más ordenada de hacer esta conversión.

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics());
 187
Author: drspaceboo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-09 06:52:49

Mirando su requerimiento, también hay una solución alternativa. Parece que conoce las dimensiones en dp en tiempo de compilación, por lo que puede agregar una entrada dimen en los recursos. Luego puede consultar la entrada dimen y se convertirá automáticamente a píxeles en esta llamada:

final float inPixels= mActivity.getResources().getDimension(R.dimen.dimen_entry_in_dp);

Y sus dimensiones.xml tendrá:

<dimen name="dimen_entry_in_dp">72dp</dimen>

Ampliando esta idea, simplemente puede almacenar el valor de 1dp o 1sp como una entrada dimen y consultar el valor y usarlo como un multiplicador. Usando este enfoque usted aislará el código de las cosas matemáticas y confiará en la biblioteca para realizar los cálculos.

 32
Author: vine'th,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-12 05:22:09

La forma más simple (e incluso funciona desde api 1) que se prueba es:

getResources().getDimensionPixelSize(R.dimen.example_dimen);

De documentaciones:

Recuperar una dimensión para un ID de recurso particular para su uso como un tamaño en píxeles raw. Esto es lo mismo que getDimension (int), excepto el el valor devuelto se convierte en píxeles enteros para su uso como tamaño. Un conversión de tamaño implica redondear el valor base, y asegurar que un el valor base distinto de cero es de al menos un píxel de tamaño.

Sí, redondeando el valor pero no es muy malo (solo en los valores impares en los dispositivos hdpi y ldpi deben agregar un poco de valor cuando ldpi no es muy común) Probé en un dispositivo xxhdpi que convierte 4dp a 16 (píxeles) y eso es cierto.

 24
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-04 07:38:55