Konvertieren von Pixeln in dp

Lesezeit: 4 Minuten

Konvertieren von Pixeln in dp
Indhu

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

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

Gibt es eine einfache Möglichkeit, Pixel in dp umzuwandeln?

Irgendwelche Vorschläge?

Konvertieren von Pixeln in dp
Muhammad Nabel Arif

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

  • Es könnte sich lohnen, ein int Math.round(px) zurückzugeben, da die meisten Methoden einen ganzzahligen Wert erwarten

    – Raj

    7. Juli 2015 um 10:23 Uhr


  • @MuhammadBabar Dies liegt daran, dass 160 dpi (mdpi) die Basisdichte ist, aus der andere Dichten berechnet werden. hdpi zum Beispiel hat die 1,5-fache Dichte von mdpi, was eigentlich nur eine andere Art ist, 240 dpi auszudrücken. Siehe die Antwort von Zsolt Safrany unten für alle Dichten.

    – Stefan

    2. August 2015 um 2:52 Uhr

  • @TomTasche: Aus den Dokumenten für Resource.getSystem() (Hervorhebung von mir): „Gib ein globales gemeinsam genutztes Ressourcenobjekt zurück, das nur Zugriff auf Systemressourcen (keine Anwendungsressourcen) bietet und nicht für den aktuellen Bildschirm konfiguriert ist (kann keine Maßeinheiten verwendenändert sich nicht basierend auf der Ausrichtung usw.).”

    – Vicky Chijwani

    17. August 2015 um 20:39 Uhr

  • Entwickler haben die Wahl, den Wert zu begrenzen/unterschreiten. Es ist besser, dem Entwickler die Kontrolle zu geben.

    – Muhammad Nabel Arif

    24. Oktober 2015 um 23:04 Uhr

  • Ich würde empfehlen DisplayMetrics.DENSITY_DEFAULT anstatt 160f developer.android.com/reference/android/util/…

    – Milcaepsilon

    18. Januar 2016 um 13:56 Uhr


  • Dies funktioniert nicht auf allen Geräten! Das Ergebnis dieser Antwort im Vergleich zu dem der Verwendung von TypedValue.applyDimension ist auf einem OnePlus 3T nicht dasselbe (wahrscheinlich, weil OnePlus eine benutzerdefinierte Skalierung in das Betriebssystem integriert hat). Die Verwendung von TypedValue.applyDimension führt zu einem konsistenten Verhalten auf allen Geräten.

    – Ben De La Haye

    20. August 2018 um 7:52 Uhr


1646736793 785 Konvertieren von Pixeln in dp
Zsolt Safrany

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

density gleich

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

Benutze das Online-Konverter mit dpi-Werten herumspielen.

EDIT: Es scheint, dass es keine 1: 1-Beziehung zwischen gibt dpi Eimer und density. Es sieht aus wie die Nexus 5X Sein xxhdpi hat ein density Wert von 2.625 (anstatt 3). Überzeugen Sie sich selbst im Gerätemetriken.

  • “Es sieht so aus, als hätte das Nexus 5X mit xxhdpi einen Dichtewert von 2,6 (statt 3)” – Technisch gesehen hat das Nexus 5X 420 dpi und das Nexus 6/6P 560 dpi, beide landen nicht direkt in einem der Standardeimer, genau wie die Nexus 7 mit tvdpi (213 dpi). Die Site, die diese als xxdpi und xxxhdpi auflistet, ist also eine Farce. Ihr Diagramm IST korrekt, und diese Geräte werden basierend auf ihren “speziellen” dpi-Buckets richtig skaliert.

    – Steven Byle

    22. September 2016 um 16:50 Uhr

Das kannst du verwenden.. 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 erwähnt hat, kann die Verwendung dieses Ansatzes zu Problemen führen, wenn das System die Dichte ändert. Seien Sie sich dessen also bewusst!

Ich persönlich verwende dafür Context. Es ist nur ein weiterer Ansatz, den ich Ihnen mitteilen wollte

  • “Es sieht so aus, als hätte das Nexus 5X mit xxhdpi einen Dichtewert von 2,6 (statt 3)” – Technisch gesehen hat das Nexus 5X 420 dpi und das Nexus 6/6P 560 dpi, beide landen nicht direkt in einem der Standardeimer, genau wie die Nexus 7 mit tvdpi (213 dpi). Die Site, die diese als xxdpi und xxxhdpi auflistet, ist also eine Farce. Ihr Diagramm IST korrekt, und diese Geräte werden basierend auf ihren “speziellen” dpi-Buckets richtig skaliert.

    – Steven Byle

    22. September 2016 um 16:50 Uhr

1646736793 215 Konvertieren von Pixeln in dp
Tim

Wenn Sie die Dimensionen XML verwenden können, ist es sehr einfach!

In deiner res/values/dimens.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="thumbnail_height">120dp</dimen>
    ...
    ...
</resources>

Dann in Ihrem Java:

getResources().getDimensionPixelSize(R.dimen.thumbnail_height);

  • Da px to dp von der Bildschirmdichte abhängt, weiß ich nicht, wie das OP überhaupt 120 bekommen hat, es sei denn, er oder sie hat die px to dp-Methode auf allen verschiedenen Bildschirmgrößen getestet.

    – John61590

    21. Juli 2017 um 20:35 Uhr


974250cookie-checkKonvertieren von Pixeln in dp

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

Privacy policy