android - pantalla - ¿Cuál es la forma correcta de especificar las dimensiones en DIP a partir del código de Java?
html string android (4)
Descubrí que es posible establecer las dimensiones de los elementos de mi interfaz en diseños XML usando DIP como en el siguiente fragmento:
android:layout_width="10dip"
Pero toda la interfaz Java toma un entero como argumentos y no hay forma de especificar las dimensiones en los DIP. ¿Cuál es la forma correcta de calcular esto?
Pensé que tenía que usar la densidad de propiedad de la clase DisplayMetrics
, pero ¿es esta una forma correcta?
¿Puedo confiar en que esta fórmula siempre es correcta?
píxeles * DisplayMetrics.density = inmersión
¿Hay alguna función de utilidad para la conversión en algún lugar de Android?
Creo que la mejor manera es no definir ninguna dimensión en el código, sino usar el archivo values/dimens.xml
lugar. Siempre puede definir su dimensión en la unidad deseada como:
<dimen name="my_layout_height">120dp</dimen>
y luego refiérase a esto en su Actividad como:
getResources().getDimensions(R.dimen.my_layout_height);
Esto devolverí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"
Esa es la fórmula correcta allí. Aunque DisplayMetrics.density
no es un miembro estático, entonces, de acuerdo con el mismo documento al que hizo alusión , el 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
Existe un método de utilidad creado llamado TypedValue.applyDimensions(int, float, DisplayMetrics)
que hace esto.
He aquí cómo usarlo:
// 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 puede usar, incluyendo COMPLEX_UNIT_SP
, COMPLEX_UNIT_PT
, todos encontrados en la página que he vinculado anteriormente. Si excluye el tipo de transmisión (int), obtendrá el número de coma flotante.
Encontré el mismo problema y lo encontré hurgando el código.
Usando el campo de densidad de métricas de pantalla, puede obtener un factor de escala para convertir a / desde saltos. Use el método Math.round para convertir de un float a un int sin necesidad de un molde o agregar 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;