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?
Wenn Sie eine einmalige Konvertierung durchführen möchten (z. B. zum Exportieren von Sprites aus Photoshop), Hier ist ein raffinierter Konverter.
/**
* 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.
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.
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
Tim
Wenn Sie die Dimensionen XML verwenden können, ist es sehr einfach!
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
9742500cookie-checkKonvertieren von Pixeln in dpyes
Wenn Sie eine einmalige Konvertierung durchführen möchten (z. B. zum Exportieren von Sprites aus Photoshop), Hier ist ein raffinierter Konverter.
– Paul Lammertsma
22. April 2014 um 22:25 Uhr
px
,dp
,sp
Umrechnungsformeln– Suragch
29. Juli 2017 um 3:26 Uhr
web.archive.org/web/20140808234241/http://developer.android.com/…
– kräh
28. Juni 2019 um 0:45 Uhr