Ich mache:
button.setLayoutParams(new GridView.LayoutParams(65, 65));
Gemäß den Dokumenten sind die Einheiten für die Breite und Höhe (beide 65 oben) "Pixel". Wie erzwingen Sie, dass dies geräteunabhängige Pixel oder "dp" sind?
Sie müssen es mithilfe des Skalierungsfaktors der Anzeige von dps in Pixel konvertieren.
final float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scale + 0.5f);
dp
sollpx
? Vielen Dank.Ich weiß, dass dies eine alte Frage ist, aber ich habe einen viel saubereren Weg gefunden, diese Konvertierung durchzuführen.
Java
Kotlin
quelle
65
obige ist der DP-Wert, den Sie in PX konvertieren möchtenWenn Sie sich Ihre Anforderungen ansehen, gibt es auch eine alternative Lösung. Anscheinend kennen Sie die Dimensionen in dp zur Kompilierungszeit, sodass Sie den Ressourcen einen Dimen-Eintrag hinzufügen können. Anschließend können Sie den Bemaßungseintrag abfragen und er wird bei diesem Aufruf automatisch in Pixel konvertiert:
Und Ihre dimension.xml wird haben:
Wenn Sie diese Idee erweitern, können Sie einfach den Wert 1dp oder 1sp als Maßeintrag speichern, den Wert abfragen und als Multiplikator verwenden. Mit diesem Ansatz isolieren Sie den Code aus dem mathematischen Material und verlassen sich bei der Durchführung der Berechnungen auf die Bibliothek.
quelle
Der einfachste Weg (und funktioniert sogar ab API 1), der getestet wurde, ist:
Aus Dokumentationen:
Ja, es rundet den Wert ab, aber es ist nicht sehr schlecht (nur bei ungeraden Werten auf hdpi- und ldpi-Geräten muss ein kleiner Wert hinzugefügt werden, wenn ldpi nicht sehr häufig ist). Ich habe in einem xxhdpi-Gerät getestet, das 4dp in 16 (Pixel) konvertiert, und das ist wahr.
quelle