Zwei Bildschirme, abgesehen von der Dichte, fast gleich groß:
Der linke Bildschirm ist ein Emulator 768x1280 160dpi (MDPI). Rechter Bildschirm ist ein Emulator 720x1280 320dpi (XHDPI).
Ich benutze Breite 300dp und Höhe 300dp. XML:
%Vor%Unabhängig von der Empfindlichkeit / Bildqualität sollten beide Bilder nicht den gleichen Platz in beiden (und anderen) Bildschirmen einnehmen? Es gibt eine Antwort, die diese Aussage hier bestätigt / p>
BEARBEITEN: Ich habe gesehen, dass Benutzer sagen, dass Sie dasselbe XML für verschiedene Bildschirme duplizieren müssen, damit Sie die DP-Werte von Elementen ändern können. Wenn das wahr ist, Ich glaube, ich habe den Zweck der DP-Einheit falsch verstanden. Ich dachte, es war beabsichtigt, das Bild mit genau der gleichen Größe über verschiedene Bildschirme mit den gleichen DP-Werten zu haben. Können Sie das bitte klären?
Ich denke, die Tatsache, dass Emulatoren verwendet werden, verursacht hier ein wenig Verwirrung.
Das Angeben von dp-Einheiten, wie Sie es hier getan haben, sollte bedeuten, dass das Bild auf verschiedenen Geräten ungefähr dieselbe physikalische Größe aufweist. In Ihrer Frage haben Sie gesagt, dass wir zwei Bildschirme fast gleicher Größe vergleichen, aber das ist nicht der Fall!
Angesichts der von Ihnen in der Frage getroffenen Entschließungen betrachten wir tatsächlich (ungefähr) ein 9-Zoll-Tablet auf der linken Seite und ein 4,5-Zoll-Telefon auf der rechten Seite. Da es sich um virtuelle Geräte handelt, die auf dem Bildschirm in der Größe verändert werden können, können sie so aussehen, dass sie die gleiche Größe haben, aber sie repräsentieren in Wirklichkeit sehr unterschiedliche Dinge.
Auf der linken Seite können wir anhand der Statusleiste und der Systemschaltflächen sehen, dass dies tatsächlich wie ein Tablet aussieht, und ich habe die Symbole in der Statusleiste hier als grobes Maß für die Skalierung verwendet:
Dies unterstützt die Erwartung, dass, wenn Sie tatsächlich ein Tablet und ein Telefon vor sich hätten (oder wenn die Emulatoren im richtigen Verhältnis wären), das Bild auf beiden die gleiche physische Größe hätte.
Bearbeiten - zusätzliches Detail als Antwort auf die Kommentare zu dieser Antwort:
Der Zweck der Beschreibung von Größen in dp besteht darin, dass sie auf Geräten mit unterschiedlichen Pixeldichten dieselbe physikalische Größe haben. Das haben Sie oben gemacht. Wenn das Element z. B. 2 Zoll auf jeder Seite ist, dann beträgt es 2 Zoll bei einem Telefon mit hoher Auflösung oder niedriger Auflösung, und es wird bei einer hochauflösenden oder niedrigauflösenden Tablette 2 Zoll sein. p>
Wenn Sie nicht möchten, dass das Element die gleiche tatsächliche Größe hat, aber immer den gleichen Anteil des Bildschirms (wie immer 90% der Breite des Bildschirms sagen) dann gibt es ein paar Arten von Layout Sie könnte aus wählen.
LinearLayout
verwendet das Konzept von Weight, um unterschiedliche Proportionen des Raums zuzuweisen .
Die Support-Bibliothek enthält PercentRelativeLayout
und PercentFrameLayout
, die wie die normalen Layouts funktionieren, aber Ihnen erlauben Größen mithilfe von Prozentangaben angeben.
Das neue ConstraintLayout
ist derzeit nur in Android Studio 2.2 Preview Edition verfügbar. Ich habe es selbst noch nicht benutzt, aber es scheint, als ob es eigene proportions- und prozentbasierte Konzepte beinhaltet, die dies auch ermöglichen würden.
Sie können dies auch beim Programmieren tun, also können Sie für verschiedene Bildschirmgrößen (auch für verschiedene Dichten) die Bildgröße in Prozent einstellen, indem Sie die Bildschirmabmessungen erhalten und dann die Anzahl der Pixel berechnen (in Prozent) ) erforderlich für die Breite und Höhe wie folgt.
%Vor%Einfache Erläuterung:
Erster Bildschirm mit 160 [MDPI]:
Hier 1 dp [Wird von Ihnen in der ImageView-Breite von xml verwendet] = 1 Pixel [px]. Wie es die Spezifikation von Android ist. So wird das Bild in Breite und Höhe in 300 Pixel angezeigt.
Zweiter Bildschirm mit 320 [XHDPI]:
Hier 1 dp [Von Ihnen in xmls ImageView width] = 2 Pixel [px].
Und da Sie "300dp" in Breite und Höhe verwendet haben, bedeutet das, dass Sie Android bitten, "dichtere Pixel" [dp] anstelle von physischen Pixeln [px] zu verwenden.
Also, 300 dp = 600 Pixel [px]
Aus diesem Grund hat ImageView im zweiten Emulator doppelte Größe.
Hoffe, es löscht Zweifel.
Lösung:
Wenn Sie möchten, dass Ihr ImageView die gleiche Breite und Höhe aufweist, können Sie das Attribut android: weight sowohl in android: width als auch in android: height verwenden. Dadurch wird auf beiden Seiten des Bildausschnitts der gleiche Platz zugewiesen.
Beispielcode zum Finden der Dichte zur Laufzeit:
%Vor%Tags und Links android