So erhalten Sie Bildschirmabmessungen als Pixel in Android

Lesezeit: 4 Minuten

So erhalten Sie Bildschirmabmessungen als Pixel in Android
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

So erhalten Sie Bildschirmabmessungen als Pixel in Android
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

So erhalten Sie Bildschirmabmessungen als Pixel in Android
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


1646776989 767 So erhalten Sie Bildschirmabmessungen als Pixel in Android
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


1646776989 427 So erhalten Sie Bildschirmabmessungen als Pixel in Android
Zelleriation

Einfachster Weg:

 int screenHeight = getResources().getDisplayMetrics().heightPixels;
 int screenWidth = getResources().getDisplayMetrics().widthPixels; 

978190cookie-checkSo erhalten Sie Bildschirmabmessungen als Pixel in Android

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy