Legen Sie die Höhe für LayoutParams programmgesteuert als dichteunabhängige Pixel fest

Lesezeit: 2 Minuten

Benutzer-Avatar
psychotik

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.

Benutzer-Avatar
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

Benutzer-Avatar
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);
}

1334890cookie-checkLegen Sie die Höhe für LayoutParams programmgesteuert als dichteunabhängige Pixel fest

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy