Как получить высоту DisplayCutout при создании деятельности? - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть игра с полным экраном SurfaceView (Портрет) и нитью, которая непрерывно рендерится на поверхности.

SurfaceView инициализируется onCreate, а его размер определяется шириной и высотой экрана в пикселях.

После того, как он создан, он устанавливается как представление содержимого игровой активности (без определений XML):

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

MySurfaceView renderView = new MySurfaceView(this, frameBuffer);

this.setContentView(renderView);

Проблема в том, что высота экрана не включает в себя вырезы дисплея (для устройств, у которых они есть) и выше, чем разрешенный экран рисования, поскольку renderView расположен ниже области выреза и не использует его для рендеринга.

Я пытаюсь найти реальное screen height - display cutout height, чтобы я мог сделать буфер кадра такой высоты.

Знаете ли вы, есть ли способ получить высоту области выреза дисплея onCreate, точно так же, как мы можем получить высоту навигации / строки состояния. Ниже приведен фрагмент, который возвращает высоту панели навигации:

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

Спасибо за помощь!

--- ОБНОВЛЕНИЕ ---

Я постараюсь прояснить вопрос подробнее:

1) onCreate полноэкранный портрет SurfaceView создается с размерами ширины и высоты экрана (без XML)

2) Режим погружения включен для уровня API> 19 (KitKat)

3) Ширина и высота экрана берется с помощью Display.getSize () или Display.getRealSize () в зависимости от уровня API

4) На устройствах с верхним вырезом дисплея вид автоматически размещается под вырезом, а нижнее содержимое вырезается, , и это проблема

5) Я хотел бы получить высоту выреза дисплея onCreate, чтобы я мог создать высоту SurfaceView равной screenHeight - displayCutoutHeight.

6) Проблема сводится к поиску высоты выреза дисплея.

Ответы [ 4 ]

0 голосов
/ 02 августа 2019

Вот как в 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);
        }
    });
}

Пожалуйста, поменяйте местами любое представление на экране (для drumRoll1Button) и getSafeInsetTop () (для getSafeInsetLeft ()), если вы находитесь в портретном режиме, который задает оригинальный вопрос. Этот образец работает для Пейзаж.

0 голосов
/ 11 сентября 2018

Прекратите читать частные ресурсы Android и прекратите вызывать getRealSize (). Просто вызовите getSize (), и значения, которые вы получите, будут полезны.

0 голосов
/ 17 апреля 2019

Кажется, что нет способа получить WindowInsets объект в onCreate. Ваш Activity должен быть сначала прикреплен к окну. Итак, ваши варианты:

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
        return@setOnApplyWindowInsetsListener insets
    }
}
0 голосов
/ 05 сентября 2018

WindowInsets.getDisplayCutout() возвращает объект DisplayCutout, если имеется.

Чтобы получить ограничивающий прямоугольник выреза дисплея, вы можете использовать

DisplayCutout.getBoundingRects()

Появится список Rect всех вырезов дисплея (нефункциональная область) на экране.

Чтобы получить высоту каждого выреза дисплея,

Rect.height()

Это также может возвращать отрицательные значения, поэтому обязательно примите модуль высоты.

Для получения дополнительной информации о поддержке вырезов на экране см. Следующие ссылки:

андроида: windowLayoutInDisplayCutoutMode

DisplayCutout

layoutInDisplayCutoutMode

WindowInsets

WindowInsets.getDisplayCutout ()

...