Gibt es eine Möglichkeit, die Höhe/Breite von a einzustellen LayoutParams als dichteunabhängige Pixel (dp)? Es sieht so aus, als ob die Höhe/Breite, wenn sie programmgesteuert eingestellt wird, in Pixeln und nicht in dp angegeben wird.
Legen Sie die Höhe für LayoutParams programmgesteuert als dichteunabhängige Pixel fest
psychotik
Mokus
Sie müssen Ihren Dip-Wert in Pixel umrechnen:
int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, <HEIGHT>, getResources().getDisplayMetrics());
Für mich ist das der Trick.
-
Ich denke, dass getActivity().getResources().getDimension(resourceID) die richtigen Konvertierungsvorgänge durchführt.
– StErMi
30. März 2012 um 10:26 Uhr
-
Funktioniert für mich, aber es unterscheidet sich … wenn ich die Breite/Höhe einer ImageView mit der obigen Methode im Vergleich zur Verwendung von XML festlege. Im XML habe ich 85dp eingestellt, während die obige Methode “75” benötigt, um die gleiche Größe zu erzeugen. Irgendeine Idee warum?
– Dirk
18. September 2014 um 23:26 Uhr
-
@Dirk Es gibt wahrscheinlich ein Padding/Margin-Problem, wenn Sie es programmgesteuert festlegen (normalerweise müssen Sie das Padding selbst angeben, wenn Sie es im Code festlegen). Es sollte keinen Unterschied zwischen dem Setzen von dp in XML oder im Code geben.
– Bitcoin Cash – ADA-Enthusiast
23. Oktober 2014 um 8:59 Uhr
Hades
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);
-
Das ist… wirklich falsch. Sie haben fest codiert, nur eine feste Anzahl von Dichten zu unterstützen. Wenn Sie mit dem Dichteskalierungsfaktor skalieren möchten, multiplizieren Sie einfach mit developer.android.com/reference/android/util/… was auch dasselbe wäre wie (size * metrics.densityDpi) / DisplayMetrics.DENSITY_DEFAULT.
– Hackbod
11. Mai 2011 um 6:47 Uhr
-
Ja, Ihre neue Antwort ist vernünftig. Oder wie gesagt, einfach mit metrics.density multiplizieren. Dafür ist es da.
– Hackbod
11. Mai 2011 um 22:07 Uhr
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, den Umrechnungskurs zu verwenden, da normalerweise mehr als ein Wert umgerechnet werden muss. Da sich der Umrechnungskurs nicht ändert, spart es etwas Bearbeitungszeit.
/**
* 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;
}
Hier ist mein Ausschnitt:
public class DpiUtils {
public static int toPixels(int dp, DisplayMetrics metrics) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
}
}
wo DisplayMetrics metrics = getResources().getDisplayMetrics()
Die beantwortete Lösung hat bei mir nicht funktioniert, die Höhe der Ansicht war immer noch ausgeschaltet. Ich landete mit diesem, 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);
}