¿Hay alguna forma de establecer el alto / ancho de un LayoutParams como píxeles independientes de la densidad (dp)? Parece que la altura / anchura, cuando se establece mediante programación, están en píxeles y no en dp.
¿Hay alguna forma de establecer el alto / ancho de un LayoutParams como píxeles independientes de la densidad (dp)? Parece que la altura / anchura, cuando se establece mediante programación, están en píxeles y no en dp.
Respuestas:
Necesita convertir su valor de inmersión en píxeles:
int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, <HEIGHT>, getResources().getDisplayMetrics());
Para mí este es el truco.
public static int getDPI(int size, DisplayMetrics metrics){
return (size * metrics.densityDpi) / DisplayMetrics.DENSITY_DEFAULT;
}
Llama a la función así,
DisplayMetrics metrics;
metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int heigh = getDPI(height or width, metrics);
Como se puede usar varias veces:
public static int convDpToPx(Context context, float dp) {
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
}
Me resultó más práctico utilizar la tasa de conversión, ya que habitualmente se debe convertir más de un valor. Como la tasa de conversión no cambia, ahorra un poco de tiempo de procesamiento.
/**
* Get conversion rate from dp into px.<br>
* E.g. to convert 100dp: px = (int) (100 * convRate);
* @param context e.g. activity
* @return conversion rate
*/
public static float convRateDpToPx(Context context) {
return context.getResources().getDisplayMetrics().densityDpi / 160f;
}
La solución respondida no funcionó para mí, la altura de la vista todavía estaba apagada. Terminé con esto, que funciona bien:
protected int dp2px(int dp){
final float scale = getResources().getDisplayMetrics().density;
return (int) (dp * scale + 0.5f);
}
Y si quieres al revés, los píxeles dp ...
protected float px2dp(float px){
DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
float dp = px / (metrics.densityDpi / 160f);
return Math.round(dp);
}