webentwicklung-frage-antwort-db.com.de

Wie erhalte ich die Höhe der DisplayCutout beim Erstellen einer Aktivität?

Ich habe ein Spiel mit Vollbild SurfaceView (Portrait) und Thread, das kontinuierlich auf der Oberfläche erscheint. 

Die SurfaceView wird onCreate initialisiert und ihre Größe wird durch die Breite und Höhe des Bildschirms in Pixel bestimmt.

Nach der Erstellung wird sie als Inhaltsansicht der Spielaktivität festgelegt (keine XML-Definitionen):

Bitmap frameBuffer = Bitmap.createBitmap(screenWidth, screenHeight, Config.ARGB_8888);

MySurfaceView renderView = new MySurfaceView(this, frameBuffer);

this.setContentView(renderView);

Das Problem ist, dass die Höhe des Bildschirms keine Anzeigeausschnitte enthält (für Geräte, die über solche verfügen) und höher ist als der erlaubte Zeichnungsbildschirm, da die Renderansicht unter dem Ausschnittbereich platziert ist und nicht zum Rendern verwendet wird.

Ich suche den echten screen height - display cutout height, damit ich den Bildpuffer auf diese Höhe bringen kann.

Wissen Sie, ob es eine Möglichkeit gibt, die Höhe des Anzeigeausschnittbereichs onCreate zu erhalten, genauso wie wir die Höhe der Navigations-/Statusleiste erhalten können. Nachfolgend finden Sie einen Ausschnitt, der die Höhe der Navigationsleiste anzeigt:

Resources resources = getResources();
int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "Android");
if (resourceId > 0) {
    int navigationBarHeight = resources.getDimensionPixelSize(resourceId);
}

Danke für deine Hilfe!

--- UPDATE ---

Ich werde versuchen, die Frage mehr zu klären:

1) onCreate ein Vollbild-Portrait SurfaceView wird mit den Abmessungen der Bildschirmbreite und -höhe erstellt (kein XML)

2) Der Immersionsmodus ist für API-Ebene> 19 (KitKat) aktiviert.

3) Die Bildschirmbreite und -höhe wird abhängig von der API-Ebene mit Display.getSize () oder Display.getRealSize () übernommen

4) Bei Geräten mit oberem Displayausschnitt wird die Ansicht automatisch unter dem Ausschnitt platziert und der untere Inhalt wird ausgeschnitten, und dies ist das Problem.

5) Ich möchte die Höhe des Anzeigeausschnitts onCreate abrufen, damit ich die SurfaceView-Höhe als screenHeight - displayCutoutHeight erstellen kann.

6) Das Problem besteht darin, die Höhe des Anzeigeausschnitts zu ermitteln.

8
luben

Es scheint keine Möglichkeit zu geben, WindowInsets -Objekt in onCreate abzurufen. Ihr Activity muss zuerst an das Fenster angehängt werden. Ihre Möglichkeiten sind also:

1.

override fun onAttachedToWindow() {
    val cutout = window.decorView.rootWindowInsets.displayCutout
}

2.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    contentView?.setOnApplyWindowInsetsListener { _, insets ->
        val cutout = insets.displayCutout
        [email protected] insets
    }
}
4

WindowInsets.getDisplayCutout() gibt das Objekt DisplayCutout zurück, falls vorhanden.

Um das umgrenzende Rechteck des Bildschirmausschnitts zu erhalten, können Sie verwenden

DisplayCutout.getBoundingRects()

Sie erhalten eine Liste von Rect aller Bildschirmausschnitte (nicht funktionaler Bereich) auf dem Bildschirm.

Um die Höhe der einzelnen Displayausschnitte zu ermitteln,

Rect.height()

Dies kann auch negative Werte zurückgeben. Stellen Sie daher sicher, dass Sie den Höhenmodul verwenden.

Weitere Informationen zur Unterstützung von Bildschirmausschnitten finden Sie unter den folgenden Links:

Android: windowLayoutInDisplayCutoutMode

DisplayCutout

layoutInDisplayCutoutMode

WindowInsets

WindowInsets.getDisplayCutout ()

Hier ist, wie in onCreate ():

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {

    drumRoll1Button.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
        @Override
        public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {

                DisplayCutout displayCutout = drumRoll1Button.getRootWindowInsets().getDisplayCutout();
                if (displayCutout!=null) {
                    displayCutoutLengthPx = displayCutout.getSafeInsetLeft();
                }
            Log.v(LOG_TAG,"displayCutoutLengthPx:"+displayCutoutLengthPx);
        }
    });
}

Bitte tauschen Sie eine Ansicht auf dem Bildschirm (für drumRoll1Button) und getSafeInsetTop () (für getSafeInsetLeft ()) aus, wenn Sie sich im Hochformat-Modus befinden, den die ursprüngliche Frage stellt. Dieses Beispiel funktioniert für Landscape.

1
TomV

Hören Sie auf, private Android-Ressourcen zu lesen, und rufen Sie getRealSize () nicht mehr auf. Rufen Sie einfach getSize () auf, und die Werte, die Sie zurückerhalten, sind gut zu verwenden.

0
j__m