Ich versuche, eine variable Anzahl von Pixeln zu dichteunabhängigen Pixeln zu berechnen und umgekehrt.
Diese Formel (px to dp): dp = (int)(px / (displayMetrics.densityDpi / 160));
funktioniert bei kleinen Geräten nicht, da sie durch Null geteilt wird.
Dies ist meine dp to px Formel:
px = (int)(dp * (displayMetrics.densityDpi / 160));
Könnte mir jemand ein paar Hinweise geben?
Antworten:
Hinweis: Die oben weit verbreitete Lösung basiert auf
displayMetrics.density
. In den Dokumenten wird jedoch erläutert, dass es sich bei diesem Wert um einen gerundeten Wert handelt, der mit den Bildschirm-Buckets verwendet wird. Z.B. Auf meinem Nexus 10 wird 2 zurückgegeben, wobei der tatsächliche Wert 298 dpi (real) / 160 dpi (Standard) = 1,8625 beträgt.Abhängig von Ihren Anforderungen benötigen Sie möglicherweise die genaue Transformation, die folgendermaßen erreicht werden kann:
[Bearbeiten] Dies ist nicht dazu gedacht, mit der internen dp-Einheit von Android gemischt zu werden, da dies natürlich immer noch auf den Bildschirm-Buckets basiert. Verwenden Sie diese Option, wenn Sie eine Einheit wünschen, die auf verschiedenen Geräten dieselbe tatsächliche Größe wiedergeben soll.
Konvertiere dp in Pixel:
Pixel in dp konvertieren:
Beachten Sie, dass es xdpi- und ydpi-Eigenschaften gibt, die Sie vielleicht unterscheiden möchten, aber ich kann mir keine vernünftige Anzeige vorstellen, bei der sich diese Werte stark unterscheiden.
quelle
Ich habe mein Problem mit den folgenden Formeln gelöst. Mögen andere Menschen davon profitieren.
dp bis px:
px bis dp:
quelle
px bis dp:
quelle
typedValue.applyDimension( TypedValue.COMPLEX_UNIT_PX, valueInDp , getResources() .getDisplayMetrics());
ist von PX zu DP, auch dies ist die beste AntwortapplyDimension
liefert nur Pixel. Siehe android.googlesource.com/platform/frameworks/base/+/refs/heads/…, für die keine Konvertierung durchgeführt wirdCOMPLEX_UNIT_PX
.dp
. Wenn Sie sich den Quellcode schauen, für den FallTypedValue.COMPLEX_UNIT_DIP
,value * metrics.density
zurückgegeben wird , wo Sie tatsächlich benötigenvalue * metrics.density
. Also , was Sie getting` valueInDp` ist NICHT indp
fürvalueInPx
inpx
.value / metrics.density
"Effizienter Weg überhaupt
DP zu Pixel:
Pixel zu DP:
Hoffe das wird dir helfen.
quelle
displayMetrics.xdpi
was auf jedem Gerät anders ist. Leider hat diese falsche Antwort zusätzlich die meisten positiven Stimmen.private fun dpToPx(dp: Int) = (dp * Resources.getSystem().displayMetrics.density).toInt()
Rufen Sie einfach
getResources().getDimensionPixelSize(R.dimen.your_dimension)
an, um vondp
Einheiten in Pixel zu konvertierenquelle
Verwenden Sie diese Funktion
quelle
quelle
(displayMetrics.densityDpi / 160)
- Dieser Teil kann auf kleinen Geräten 0 bekommen, dort wird beispielsweise berechnet120/160
, dass beide Werte int sind, was zu 0 führt. Was als endet(int) (px/0)
.In den meisten Fällen werden Konvertierungsfunktionen häufig aufgerufen. Wir können es optimieren, indem wir Memoisierung hinzufügen. Es wird also nicht jedes Mal berechnet, wenn die Funktion aufgerufen wird.
Deklarieren wir eine HashMap, in der die berechneten Werte gespeichert werden.
Eine Funktion, die Pixelwerte berechnet:
Eine Memo-Funktion, die den Wert von HashMap zurückgibt und die Aufzeichnung vorheriger Werte verwaltet.
Memoization kann in Java auf verschiedene Arten implementiert werden. Für Java 7 :
Java 8 unterstützt die Lambda-Funktion :
Vielen Dank.
quelle
Versuchen Sie dies http://labs.skinkers.com/content/android_dp_px_calculator/
quelle
Die folgenden Funktionen haben für mich geräteübergreifend gut funktioniert.
Es stammt von https://gist.github.com/laaptu/7867851
quelle
Sie können
[DisplayMatrics][1]
die Bildschirmdichte verwenden und bestimmen. Etwas wie das:Wie ich mich erinnere, ist es besser, Bodenbeläge für Versätze und Rundungen für Breiten zu verwenden.
quelle
Wenn Sie nach einem Online-Rechner suchen, mit dem Sie DP, SP, Zoll, Millimeter, Punkte oder Pixel mit unterschiedlichen Bildschirmdichten voneinander und voneinander konvertieren können, ist dies das umfassendste Tool, das ich kenne .
quelle
// um in Dezimal / Float zu kommen
________________________________________________________________________________
quelle
Verwenden Sie diese Kotlin-Erweiterungen:
quelle
Fühlen Sie sich frei, diese Methode zu verwenden, die ich geschrieben habe:
quelle
Die oben akzeptierte Antwort ist nicht vollständig korrekt. Nach Informationen, die durch Überprüfen des Android-Quellcodes erhalten wurden:
Resources.getDimension()
undgetDimensionPixelOffset()
/getDimensionPixelSize()
unterscheiden sich nur darin, dass die ersteren zurückgeben,float
während die beiden letzteren den gleichen Wert zurückgeben, der aufint
angemessen gerundet ist . Für alle ist der Rückgabewert in Rohpixeln angegeben.Alle drei Funktionen werden durch Aufruf implementiert
Resources.getValue()
und die Umwandlung so erhaltenenTypedValue
durch den AufrufTypedValue.complexToDimension()
,TypedValue.complexToDimensionPixelOffset()
undTypedValue.complexToDimensionPixelSize()
, respectively.Wenn Sie daher einen "Rohwert" zusammen mit der in der XML-Quelle angegebenen Einheit erhalten möchten, rufen Sie
Resources.getValue()
die Methoden derTypedValue
Klasse auf und verwenden Sie sie .quelle
Mit Hilfe anderer Antworten habe ich diese Funktion geschrieben.
quelle
Hier ist eine andere Möglichkeit, dies mit Kotlin-Erweiterungen zu tun:
und dann kann es von überall so verwendet werden
quelle
quelle
Variation der obigen Antwort von ct_robs: Wenn Sie Ganzzahlen verwenden, wird nicht nur die Division durch 0 vermieden, sondern auch auf kleinen Geräten ein brauchbares Ergebnis erzielt:
Bei Ganzzahlberechnungen mit Division für höchste Präzision multiplizieren Sie zuerst, bevor Sie dividieren, um Kürzungseffekte zu reduzieren.
anstatt
Wenn Sie ein abgerundetes Ergebnis wünschen, tun Sie dies
quelle