963 Stimmen

Umrechnung von Pixel in dp

Ich habe meine Anwendung mit der angegebenen Höhe und Breite in Pixeln für ein Pantech-Gerät erstellt, dessen Auflösung beträgt 480x800 .

Ich muss Höhe und Breite für ein G1-Gerät umrechnen.
Ich dachte, die Umwandlung in dp würde das Problem lösen und für beide Geräte die gleiche Lösung bieten.

Gibt es eine einfache Möglichkeit, Pixel in dp zu konvertieren?
Irgendwelche Vorschläge?

1166voto

prasobh Punkte 11939

Java-Code:

// Converts 14 dip into its equivalent px
float dip = 14f;
Resources r = getResources();
float px = TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_DIP,
    dip,
    r.getDisplayMetrics()
);

Kotlin-Code:

 val dip = 14f
 val r: Resources = resources
 val px = TypedValue.applyDimension(
     TypedValue.COMPLEX_UNIT_DIP,
     dip,
     r.displayMetrics
 )

Kotlin-Erweiterung:

val Number.toPx get() = TypedValue.applyDimension(
  TypedValue.COMPLEX_UNIT_DIP,
  this.toFloat(),
  Resources.getSystem().displayMetrics)

950voto

Muhammad Nabeel Arif Punkte 18842
/**
 * This method converts dp unit to equivalent pixels, depending on device density. 
 * 
 * @param dp A value in dp (density independent pixels) unit. Which we need to convert into pixels
 * @param context Context to get resources and device specific display metrics
 * @return A float value to represent px equivalent to dp depending on device density
 */
public static float convertDpToPixel(float dp, Context context){
    return dp * ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}

/**
 * This method converts device specific pixels to density independent pixels.
 * 
 * @param px A value in px (pixels) unit. Which we need to convert into db
 * @param context Context to get resources and device specific display metrics
 * @return A float value to represent dp equivalent to px value
 */
public static float convertPixelsToDp(float px, Context context){
    return px / ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}

314voto

Mike Keskinov Punkte 10854

Vorzugsweise in eine Util.java-Klasse einfügen

public static float dpFromPx(final Context context, final float px) {
    return px / context.getResources().getDisplayMetrics().density;
}

public static float pxFromDp(final Context context, final float dp) {
    return dp * context.getResources().getDisplayMetrics().density;
}

226voto

Zsolt Safrany Punkte 12660
float density = context.getResources().getDisplayMetrics().density;
float px = someDpValue * density;
float dp = somePxValue / density;

density ist gleich

  • .75 auf ldpi ( 120 dpi)
  • 1.0 auf mdpi ( 160 dpi; Basislinie)
  • 1.5 auf hdpi ( 240 dpi)
  • 2.0 auf xhdpi ( 320 dpi)
  • 3.0 auf xxhdpi ( 480 dpi)
  • 4.0 auf xxxhdpi ( 640 dpi)

Verwenden Sie diese Online-Konverter um mit den dpi-Werten herumzuspielen.

EDIT: Es scheint keine 1:1-Beziehung zu bestehen zwischen dpi Eimer und density . Es sieht so aus, als ob die Nexus 5X unter xxhdpi hat eine density Wert von 2.625 (anstelle von 3 ). Überzeugen Sie sich selbst in der Geräte-Metriken .

144voto

Maher Abuthraa Punkte 16550

Sie können diese ohne Kontext

public static int pxToDp(int px) {
    return (int) (px / Resources.getSystem().getDisplayMetrics().density);
}

public static int dpToPx(int dp) {
    return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}

Wie @Stan bereits erwähnt hat, kann dieser Ansatz zu Problemen führen, wenn sich die Systemdichte ändert. Seien Sie sich dessen also bewusst!

Ich persönlich verwende Context, um dies zu tun. Es ist nur ein weiterer Ansatz, den ich Ihnen vorstellen möchte

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X