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?

110voto

Alex Punkte 17724

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

In Ihrem 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);

78voto

Ricardo Magalhães Punkte 1793

Laut dem Android Development Guide:

px = dp * (dpi / 160)

Aber oft muss man das umgekehrt machen, wenn man einen Entwurf erhält, der in Pixeln angegeben ist. So:

dp = px / (dpi / 160)

Bei einem Gerät mit 240 dpi beträgt dieses Verhältnis 1,5 (wie bereits erwähnt), was bedeutet, dass ein 60-Pixel-Symbol 40 dpi in der Anwendung entspricht.

73voto

Adam Stelmaszczyk Punkte 19275

Ohne Context , elegante statische Methoden:

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

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

71voto

beigirad Punkte 3983

Die Verwendung der Kotlin-Erweiterung macht es besser

fun Int.toPx(context: Context): Int = (this * context.resources.displayMetrics.density).toInt()

fun Int.toDp(context: Context): Int = (this / context.resources.displayMetrics.density).toInt()

UPDATE:

Wegen der displayMetrics ist Teil von [globale gemeinsame Ressourcen](https://developer.android.com/reference/android/content/res/Resources#getSystem()) können wir verwenden Resources.getSystem()

val Float.toPx get() = this * Resources.getSystem().displayMetrics.density

val Float.toDp get() = this / Resources.getSystem().displayMetrics.density

val Int.toPx get() = (this * Resources.getSystem().displayMetrics.density).toInt()

val Int.toDp get() = (this / Resources.getSystem().displayMetrics.density).toInt()

PS: Gemäß dem Kommentar von @EpicPandaForce:

Sie sollten hierfür nicht Resources.getSystem() verwenden, da diese Funktion nicht für Foldables und Chrome OS-Geräte geeignet ist.

48voto

Gunhan Punkte 6241

Für alle, die Kotlin verwenden:

val Int.toPx: Int
    get() = (this * Resources.getSystem().displayMetrics.density).toInt()

val Int.toDp: Int
    get() = (this / Resources.getSystem().displayMetrics.density).toInt()

使用方法

64.toPx
32.toDp

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