So erhalten Sie Bildschirmabmessungen als Pixel in Android
Lesezeit: 4 Minuten
Niko Gamulin
Ich habe einige benutzerdefinierte Elemente erstellt und möchte sie programmgesteuert in der oberen rechten Ecke platzieren (n Pixel vom oberen Rand und m Pixel vom rechten Rand). Daher muss ich die Bildschirmbreite und Bildschirmhöhe abrufen und dann die Position festlegen:
int px = screenWidth - m;
int py = screenHeight - n;
Wie komme ich screenWidth und screenHeight in der Hauptaktivität?
Verwenden Sie dp anstelle von px. weil es Ihr Layout mit anderen Geräten verzerrt.
– Zar E. Ahmer
24. April 2014 um 6:13 Uhr
Vergessen Sie nicht, mit getResources().getDisplayMetrics().density zu multiplizieren, um die Anzeigeskalierung zu berücksichtigen
– makellos
16. Juni 2014 um 12:53 Uhr
Dies beweist, dass die am meisten positiv bewertete Antwort nicht immer die beste ist (und viele Leute wiederholen Antworten für Repräsentanten). Probieren Sie anstelle von getSize und der veralteten getWidth/getHeight-Kombination (Ignorieren von Fehlern) Balaji.Ks aus getMetrics. Niks Kommentar in seiner Antwort erklärt sogar getDisplayMetrics um die Größe der System-/Statusleiste zu berücksichtigen. Auch Sie können verwenden Dichte wie jmaculate und LoungeKatt das erklärt haben GENAU Wert:DisplayMetrics dm = getResources().getDisplayMetrics(); float fwidth = dm.density * dm.widthPixels; Getestet in Android v2.2 (API 8) und v4.0 mit guten Ergebnissen und keine Fehler/Warnungen.
– Armfuß
2. September 2014 um 10:32 Uhr
DisplayMetrics displaymetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); int Höhe = displaymetrics.heightPixels; int width = displaymetrics.widthPixels;
– Azahar
1. Mai 2015 um 5:30 Uhr
eine andere Möglichkeit, die DisplayMetrics zu erhalten: Resources.getSystem().getDisplayMetrics(). Sie brauchen keine Context um sie zu bekommen.
– Schild
8. Februar 2019 um 8:56 Uhr
Balaji.K
Ein Weg ist:
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
Es ist veraltet, und Sie sollten stattdessen den folgenden Code ausprobieren. Die ersten beiden Codezeilen geben Ihnen die DisplayMetrics Objekte. Dieses Objekt enthält die Felder wie heightPixels, widthPixels.
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int width = metrics.widthPixels;
API-Level-30-Update
final WindowMetrics metrics = windowManager.getCurrentWindowMetrics();
// Gets all excluding insets
final WindowInsets windowInsets = metrics.getWindowInsets();
Insets insets = windowInsets.getInsetsIgnoreVisibility(WindowInsets.Type.navigationBars()
| WindowInsets.Type.displayCutout());
int insetsWidth = insets.right + insets.left;
int insetsHeight = insets.top + insets.bottom;
// Legacy size that Display#getSize reports
final Rect bounds = metrics.getBounds();
final Size legacySize = new Size(bounds.width() - insetsWidth,
bounds.height() - insetsHeight);
Beachten Sie, dass sich die Metriken (Breite, Höhe) je nach Drehung des Geräts ändern.
– Toni Chan
28. November 2011 um 2:17 Uhr
Metriken geben die Größe der Anzeige zurück, aber HoneyComb und höher haben Ihre Aktivitäten aufgrund der Systemleiste weniger Platz als das, was zurückgegeben wird.
– Kerl
29. Dezember 2011 um 11:12 Uhr
@Guy es hängt von Ihrer Implementierung ab. Sie können die Statusleiste ausblenden: requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
– Hagai L
28. März 2012 um 11:00 Uhr
Gibt es auch so: getContext().getResources().getDisplayMetrics().widthPixels
– Nik
11. Juli 2012 um 5:32 Uhr
final float scale = getResources().getDisplayMetrics().density; int width = (int) (metrics.widthPixels * scale + 0.5f); – Sie müssen die Gerätedichte berücksichtigen, wenn Sie dies auf diese Weise tun.
– Verlassener Einkaufswagen
20. Februar 2014 um 4:45 Uhr
oder schreiben Sie einfach view.post
– Lukas Hanacek
19. September 2013 um 9:27 Uhr
Es ist jedoch nicht garantiert, dass view.post funktioniert. Es ist nur eine Problemumgehung.
– Marsbär
25. Februar 2014 um 14:31 Uhr
@marsbär wo steht da View.post() funktioniert nicht garantiert? Ich bin neugierig, weil ich mich auch auf diese Methode verlasse, um die Größe einer Ansicht nach dem Layout zu erhalten, und nicht wusste, dass sie unzuverlässig ist.
– Toni Chan
22. März 2014 um 0:20 Uhr
@Turbo Ich sage das: p Wir haben diese Problemumgehung schon einmal verwendet und sie hat sich als unzuverlässig herausgestellt. Diese Problemumgehung basiert auf der Annahme, dass das anfängliche Layout innerhalb derselben UIThread-Runde wie die Initialisierung erfolgt. Daher könnten Sie Ihren Code so planen, dass er vor dem nächsten UI-Turn über post() ausgeführt wird, und alles ist in Ordnung. Es stellte sich heraus, dass das Layouten unter Umständen noch länger dauern konnte und die Ansicht immer noch nicht gelayoutet war, als der gepostete Code lief. Jetzt füge ich den ViewTreeObserver in onCreate hinzu und entferne ihn nach dem ersten onLayout. Initieren Sie Ihr Material während dieses ersten OnLayouts.
– Marsbär
28. März 2014 um 15:30 Uhr
@marsbear spielt es eine Rolle, welche View du bekommst die ViewTreeObserver von? Oder teilen sich alle dasselbe?
– Toni Chan
9. April 2014 um 20:58 Uhr
Digiphd
(Antwort von 2012, möglicherweise veraltet) Wenn Sie Pre-Honeycomb unterstützen möchten, müssen Sie die Abwärtskompatibilität vor API 13 aktivieren. So etwas wie:
int measuredWidth = 0;
int measuredHeight = 0;
WindowManager w = getWindowManager();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
Point size = new Point();
w.getDefaultDisplay().getSize(size);
measuredWidth = size.x;
measuredHeight = size.y;
} else {
Display d = w.getDefaultDisplay();
measuredWidth = d.getWidth();
measuredHeight = d.getHeight();
}
Natürlich werden die veralteten Methoden irgendwann aus den neuesten SDKs entfernt, aber obwohl wir uns immer noch darauf verlassen, dass die meisten unserer Benutzer Android 2.1, 2.2 und 2.3 haben, bleibt uns das übrig.
Ja, das war 2012.
– Digiphd
22. Juni 2015 um 22:46 Uhr
Entschuldigung, lassen Sie mich klarstellen, was ich meinte. Es ist höchst unwahrscheinlich, dass irgendjemand API <14 ab dem 22.06.2015 unterstützen würde
– Sudocoder
23. Juni 2015 um 4:24 Uhr
dakshbhatt21
Ich habe alle möglichen „Lösungen“ erfolglos ausprobiert und festgestellt, dass die „Dalvik Explorer“-App von Elliott Hughes auf jedem Android-Gerät/jeder OS-Version immer die richtige Dimension anzeigt. Am Ende habe ich mir sein Open-Source-Projekt angesehen, das hier zu finden ist: https://code.google.com/p/enh/
Hier ist der gesamte relevante Code:
WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
try {
// used when 17 > SDK_INT >= 14; includes window decorations (statusbar bar/menu bar)
widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
try {
// used when SDK_INT >= 17; includes window decorations (statusbar bar/menu bar)
Point realSize = new Point();
Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
widthPixels = realSize.x;
heightPixels = realSize.y;
} catch (Exception ignored) {
}
BEARBEITEN: leicht verbesserte Version (Vermeiden Sie das Auslösen von Ausnahmen bei nicht unterstützten Betriebssystemversionen):
WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17)
try {
widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 17)
try {
Point realSize = new Point();
Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
widthPixels = realSize.x;
heightPixels = realSize.y;
} catch (Exception ignored) {
}
Ja, das war 2012.
– Digiphd
22. Juni 2015 um 22:46 Uhr
Entschuldigung, lassen Sie mich klarstellen, was ich meinte. Es ist höchst unwahrscheinlich, dass irgendjemand API <14 ab dem 22.06.2015 unterstützen würde
– Sudocoder
23. Juni 2015 um 4:24 Uhr
Zelleriation
Einfachster Weg:
int screenHeight = getResources().getDisplayMetrics().heightPixels;
int screenWidth = getResources().getDisplayMetrics().widthPixels;
9781900cookie-checkSo erhalten Sie Bildschirmabmessungen als Pixel in Androidyes
Verwenden Sie dp anstelle von px. weil es Ihr Layout mit anderen Geräten verzerrt.
– Zar E. Ahmer
24. April 2014 um 6:13 Uhr
Vergessen Sie nicht, mit getResources().getDisplayMetrics().density zu multiplizieren, um die Anzeigeskalierung zu berücksichtigen
– makellos
16. Juni 2014 um 12:53 Uhr
Dies beweist, dass die am meisten positiv bewertete Antwort nicht immer die beste ist (und viele Leute wiederholen Antworten für Repräsentanten). Probieren Sie anstelle von getSize und der veralteten getWidth/getHeight-Kombination (Ignorieren von Fehlern) Balaji.Ks aus
getMetrics
. Niks Kommentar in seiner Antwort erklärt sogargetDisplayMetrics
um die Größe der System-/Statusleiste zu berücksichtigen. Auch Sie können verwenden Dichte wie jmaculate und LoungeKatt das erklärt haben GENAU Wert:DisplayMetrics dm = getResources().getDisplayMetrics(); float fwidth = dm.density * dm.widthPixels;
Getestet in Android v2.2 (API 8) und v4.0 mit guten Ergebnissen und keine Fehler/Warnungen.– Armfuß
2. September 2014 um 10:32 Uhr
DisplayMetrics displaymetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); int Höhe = displaymetrics.heightPixels; int width = displaymetrics.widthPixels;
– Azahar
1. Mai 2015 um 5:30 Uhr
eine andere Möglichkeit, die DisplayMetrics zu erhalten:
Resources.getSystem().getDisplayMetrics()
. Sie brauchen keineContext
um sie zu bekommen.– Schild
8. Februar 2019 um 8:56 Uhr