Existe-t-il un moyen de définir la hauteur / largeur d'un LayoutParams en tant que pixels indépendants de la densité (dp)? Il semble que la hauteur / largeur, lorsqu'elle est définie par programme, est en pixels et non en dp.
Existe-t-il un moyen de définir la hauteur / largeur d'un LayoutParams en tant que pixels indépendants de la densité (dp)? Il semble que la hauteur / largeur, lorsqu'elle est définie par programme, est en pixels et non en dp.
Réponses:
Vous devez convertir votre valeur de creux en pixels:
int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, <HEIGHT>, getResources().getDisplayMetrics());
Pour moi, cela fait l'affaire.
public static int getDPI(int size, DisplayMetrics metrics){
return (size * metrics.densityDpi) / DisplayMetrics.DENSITY_DEFAULT;
}
Appelez la fonction comme ceci,
DisplayMetrics metrics;
metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int heigh = getDPI(height or width, metrics);
Puisqu'il peut être utilisé plusieurs fois:
public static int convDpToPx(Context context, float dp) {
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
}
J'ai trouvé plus pratique d'utiliser le taux de conversion, car il faut généralement convertir plus d'une valeur. Étant donné que le taux de conversion ne change pas, cela économise un peu de temps de traitement.
/**
* 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 solution répondue n'a pas fonctionné pour moi, la hauteur de la vue était toujours désactivée. J'ai fini avec ceci, qui fonctionne bien:
protected int dp2px(int dp){
final float scale = getResources().getDisplayMetrics().density;
return (int) (dp * scale + 0.5f);
}
Et si vous voulez l'inverse, les pixels à dp ...
protected float px2dp(float px){
DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
float dp = px / (metrics.densityDpi / 160f);
return Math.round(dp);
}