Ich habe meine Anwendung mit der in Pixel angegebenen Höhe und Breite für ein Pantech-Gerät mit einer Auflösung erstellt 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 für beide Geräte die gleiche Lösung bieten.
Gibt es eine einfache Möglichkeit, Pixel in dp umzuwandeln?
Irgendwelche Vorschläge?
android
pixel
resolution
dpi
Indhu
quelle
quelle
px
,dp
,sp
UmrechnungsformelnAntworten:
quelle
applyDimension
? Kann ich es einfach tungetResource().getDisplayMetrics()
oder gibt es noch etwas anderes?Context
Objektnutzung habenResources.getSystem().getDisplayMetrics()
quelle
Resource.getSystem()
(Hervorhebung von mir): " Gibt ein globales freigegebenes Ressourcenobjekt zurück, das nur Zugriff auf Systemressourcen (keine Anwendungsressourcen) bietet und nicht für den aktuellen Bildschirm konfiguriert ist ( kann keine Dimensionseinheiten verwenden , ändert sich nicht) basierend auf Orientierung usw.). "DisplayMetrics.DENSITY_DEFAULT
anstelle von160f
developer.android.com/reference/android/util/…Am besten in eine Util.java-Klasse einfügen
quelle
density
gleich.75
einldpi
(120
dpi)1.0
einmdpi
(160
dpi; Grundlinie)1.5
einhdpi
(240
dpi)2.0
einxhdpi
(320
dpi)3.0
einxxhdpi
(480
dpi)4.0
einxxxhdpi
(640
dpi)Verwenden Sie diesen Online-Konverter , um mit dpi-Werten herumzuspielen.
EDIT: Es scheint, dass es keine 1: 1-Beziehung zwischen
dpi
Bucket und gibtdensity
. Es sieht so aus, als hätte dasNexus 5X
Wesenxxhdpi
einendensity
Wert von2.625
(anstelle von3
). Überzeugen Sie sich selbst in den Gerätemetriken .quelle
Sie können dies .. ohne Kontext verwenden
Wie bei @Stan erwähnt, kann die Verwendung dieses Ansatzes zu Problemen führen, wenn das System die Dichte ändert. Also sei dir dessen bewusst!
Persönlich benutze ich Context, um das zu tun. Es ist nur ein weiterer Ansatz, mit dem ich Sie teilen wollte
quelle
Wenn Sie die Dimensionen XML verwenden können, ist es sehr einfach!
In Ihrem
res/values/dimens.xml
:Dann in Ihrem Java:
quelle
Laut dem Android Development Guide:
Aber oft möchten Sie dies umgekehrt tun, wenn Sie ein Design erhalten, das in Pixel angegeben ist. Damit:
Wenn Sie ein 240-dpi-Gerät verwenden, beträgt dieses Verhältnis 1,5 (wie zuvor angegeben). Dies bedeutet, dass ein 60-Pixel-Symbol in der Anwendung 40 dp entspricht.
quelle
Ohne
Context
elegante statische Methoden:quelle
Resources.getSystem()
javadoc sagt: "Gibt ein globales freigegebenes Ressourcenobjekt zurück, das nur Zugriff auf Systemressourcen (keine Anwendungsressourcen) bietet und nicht für den aktuellen Bildschirm konfiguriert ist (kann keine Dimensionseinheiten verwenden, ändert sich nicht basierend auf der Ausrichtung usw.)." Dies sagt ziemlich genau, dass Sie dies nicht tun sollten, auch wenn es irgendwie funktioniert.Zum
DP to Pixel
Erstellen Sie einen Wert in
dimens.xml
Erhalten Sie diesen Wert
pixel
als:quelle
Sie können daher den folgenden Formulierer verwenden, um die richtige Anzahl von Pixeln aus einer in dp angegebenen Dimension zu berechnen
quelle
convertToDp
.Für alle, die Kotlin verwenden:
Verwendungszweck:
quelle
Es gibt ein Standard-Util im Android SDK: http://developer.android.com/reference/android/util/TypedValue.html
quelle
resultPix
sollte vom Typ int sein.int resultPix = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,1,getResources().getDisplayMetrics())
Die Verwendung der Kotlin-Erweiterung macht es besser
AKTUALISIEREN:
Da dies
displayMetrics
Teil global geteilter Ressourcen ist , können wir es verwendenResources.getSystem()
quelle
Dies sollte Ihnen die Konvertierung von dp in Pixel geben:
Dies sollte Ihnen die Konvertierungspixel in dp geben:
quelle
Kotlin
Java
quelle
Wenn Sie die Bemaßung innerhalb von Werten / Bemaßung haben, ist es wahrscheinlich der beste Weg, die Bemaßung direkt von der Methode getDimension () abzurufen. Sie gibt die Bemaßung zurück, die bereits in einen Pixelwert konvertiert wurde.
Nur um das besser zu erklären,
gibt die Dimension zurück, die bereits in Pixel AS A FLOAT konvertiert wurde.
wird das gleiche zurückgeben, aber auf int abgeschnitten, also ALS INTEGER.
Siehe Android-Referenz
quelle
Dabei ist die Ressource context.getResources ().
quelle
so was:
abhängig vom Kontext, return float value, statische Methode
von: https://github.com/Trinea/android-common/blob/master/src/cn/trinea/android/common/util/ScreenUtils.java#L15
quelle
Eleganterer Ansatz mit der Erweiterungsfunktion von kotlin
Verwendungszweck:
quelle
function name
" gelesen, was in diesem Fall rückwärts ist. Um die Absicht jeder Funktion zu verdeutlichen, könnten die Namen der Funktionen aktualisiert werden, um dpToPx bzw. pxToDp zu lesen.quelle
Wenn Sie eine leistungskritische Anwendung entwickeln, berücksichtigen Sie bitte die folgende optimierte Klasse:
quelle
Um Pixel in dp zu konvertieren, verwenden Sie den TypedValue .
Wie in der Dokumentation erwähnt: Container für einen dynamisch typisierten Datenwert.
und verwenden Sie die Methode applyDimension :
Hiermit wird ein entpackter komplexer Datenwert, der eine Dimension enthält, wie folgt in seinen endgültigen Gleitkommawert konvertiert:
Ich hoffe, das hilft .
quelle
So funktioniert es bei mir:
Sie können dasselbe für die Breite tun.
quelle
Viele großartige Lösungen oben. Die beste Lösung, die ich gefunden habe, ist jedoch Googles Design:
https://design.google.com/devices/
quelle
Sie sollten dp genauso verwenden wie Pixel. Das ist alles was sie sind; unabhängige Pixel anzeigen. Verwenden Sie die gleichen Zahlen wie auf einem Bildschirm mittlerer Dichte, und die Größe ist auf einem Bildschirm hoher Dichte magisch korrekt.
Es hört sich jedoch so an, als ob Sie die Option fill_parent in Ihrem Layoutdesign benötigen. Verwenden Sie fill_parent, wenn Ihre Ansicht oder Ihr Steuerelement auf die gesamte verbleibende Größe im übergeordneten Container erweitert werden soll.
quelle
PX
undDP
sind unterschiedlich, aber ähnlich.DP
ist die Auflösung, wenn Sie nur die physische Größe des Bildschirms berücksichtigen. Wenn Sie es verwendenDP
, wird Ihr Layout auf andere Bildschirme ähnlicher Größe mit unterschiedlicherpixel
Dichte skaliert .Gelegentlich möchten Sie jedoch tatsächlich
pixels
, und wenn Sie sich mit Dimensionen im Code befassen, haben Sie es immer mit real zu tunpixels
, es sei denn, Sie konvertieren sie.Also auf einem Android-Gerät, normal großer
hdpi
Bildschirm,800x480 is 533x320
inDP
(glaube ich). Zur UmwandlungDP
inpixels /1.5
, zu konvertieren zurück*1.5
. Dies gilt nur für die eine Bildschirmgröße unddpi
würde sich je nach Design ändern. Unsere Künstler geben mirpixels
aber und ich konvertiereDP
mit der obigen1.5
Gleichung.quelle
Wenn Sie Integer- Werte möchten, wird der Float mit Math.round () auf die nächste Ganzzahl gerundet.
quelle
Die beste Antwort kommt vom Android-Framework selbst: Verwenden Sie einfach diese Gleichheit ...
(konvertiert dp in px)
quelle
Das funktioniert für mich (C #):
quelle
Kotlin
Java
quelle