it-swarm.com.de

Stellen Sie die Höhe in LayoutParams programmgesteuert als dichteunabhängige Pixel ein

Gibt es eine Möglichkeit, die Höhe/Breite von a LayoutParams als dichteunabhängige Pixel (dp) festzulegen? Es sieht so aus, als ob die Höhe/Breite, wenn programmgesteuert eingestellt, in Pixeln und nicht in dp angegeben ist.

122
psychotik

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.

268
Mokus
 public static int getDPI(int size, DisplayMetrics metrics){
     return (size * metrics.densityDpi) / DisplayMetrics.DENSITY_DEFAULT;        
 }

Rufen Sie die Funktion wie folgt auf,

DisplayMetrics metrics;
metrics = new DisplayMetrics();         
getWindowManager().getDefaultDisplay().getMetrics(metrics);

int heigh = getDPI(height or width, metrics);
12
Hades

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 konvertiert werden muss. Da sich die Conversion-Rate nicht ändert, wird ein wenig Verarbeitungszeit gespart.

/**
 * 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;
}
6

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()

5
Roman

Die beantwortete Lösung funktionierte nicht für mich, die Höhe der Ansicht war noch aus. Am Ende ist mir dies gelungen, 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);
}
0
Mr L