unidades unidad studio medidas medida entre diseño diferencia convertir app android scaling

android - studio - unidad de medida sp



Android y configuración de ancho y alto programáticamente en unidades dp (4)

En cuanto a sus necesidades, también hay una solución alternativa. Parece que conoces las dimensiones en dp en el momento de la compilación, así que puedes agregar una entrada de atenuación en los recursos. Luego puede consultar la entrada de dimen y se convertirá automáticamente en píxeles en esta llamada:

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

Y tu dimens.xml tendrá:

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

Extendiendo esta idea, simplemente puede almacenar el valor de 1dp o 1sp como una entrada de atenuación y consultar el valor y utilizarlo como multiplicador. Usando este enfoque, aislará el código del material matemático y confiará en la biblioteca para realizar los cálculos.

Estoy haciendo:

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

De acuerdo con los documentos, las unidades para el ancho y la altura (ambas 65 en la anterior) son "píxeles". ¿Cómo obliga a esto a ser píxeles independientes del dispositivo, o "dp"?


La forma más sencilla (e incluso funciona desde la API 1) que se probó es:

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

De las documentaciones:

Recupere una dimensión para un ID de recurso particular para usar como tamaño en píxeles sin procesar. Es lo mismo que getDimension (int), excepto que el valor devuelto se convierte en píxeles enteros para su uso como tamaño. Una conversión de tamaño implica redondear el valor base y garantizar que un valor base distinto de cero tenga al menos un píxel de tamaño.

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


Sé que esta es una pregunta antigua, sin embargo, he encontrado una forma mucho más clara de hacer esta conversión.

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics());


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

final float scale = getContext().getResources().getDisplayMetrics().density; int pixels = (int) (dps * scale + 0.5f);