Gibt es eine Möglichkeit, die Höhe / Breite eines LayoutParams als dichteunabhängige Pixel (dp) festzulegen ? Es sieht so aus, als ob die Höhe / Breite, wenn sie programmgesteuert eingestellt wird, in Pixel und nicht in dp angegeben ist.
Gibt es eine Möglichkeit, die Höhe / Breite eines LayoutParams als dichteunabhängige Pixel (dp) festzulegen ? Es sieht so aus, als ob die Höhe / Breite, wenn sie programmgesteuert eingestellt wird, in Pixel und nicht in dp angegeben ist.
Antworten:
Sie müssen Ihren Dip-Wert in Pixel konvertieren:
int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, <HEIGHT>, getResources().getDisplayMetrics());
Für mich ist das der Trick.
public static int getDPI(int size, DisplayMetrics metrics){
return (size * metrics.densityDpi) / DisplayMetrics.DENSITY_DEFAULT;
}
Rufen Sie die Funktion so auf:
DisplayMetrics metrics;
metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int heigh = getDPI(height or width, metrics);
Da es mehrfach verwendet werden kann:
public static int convDpToPx(Context context, float dp) {
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
}
Ich fand es praktischer, die Conversion-Rate zu verwenden, da normalerweise mehr als ein Wert konvertiert werden muss. Da sich die Conversion-Rate nicht ändert, spart dies etwas Verarbeitungszeit.
/**
* 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;
}
Die beantwortete Lösung funktionierte bei mir nicht, die Höhe der Ansicht war immer noch ausgeschaltet. Am Ende hatte ich das, was gut funktioniert:
protected int dp2px(int dp){
final float scale = getResources().getDisplayMetrics().density;
return (int) (dp * scale + 0.5f);
}
Und wenn Sie umgekehrt wollen, Pixel zu dp ...
protected float px2dp(float px){
DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
float dp = px / (metrics.densityDpi / 160f);
return Math.round(dp);
}