Подтвердить что ты не робот

Android. Представления, наложенные на последний кадр полноэкранного видео, не перерисовываются правильно при включении и выключении экрана.

У меня есть видео, которое воспроизводится в портретном режиме. В конце видео мне нужно отобразить некоторые виды. Пока это работает.

Однако у меня есть проблема, когда виды, которые находятся над последним кадром видео, неправильно перерисовываются, когда возвращаются к активности после выключения экрана, затем снова включаются, а затем разблокируют экран.

То, что я наблюдаю, это то, что когда экран возвращается и я разблокирую. Мое видео и изображения сначала отображаются вне полноэкранного режима (при этом все еще отображаются строки состояния), тогда экран переходит в полноэкранный режим, сдвигая все виды вверх и вызывая артефакты.

Похоже, что взгляды смещаются из границ их взглядов путем перехода к полноэкранному режиму после их рендеринга.

Я действительно зациклен на том, как предотвратить это.

Вот проект sandbox на github, чтобы не допустить, чтобы это сообщение было заполнено кодом.

Базовая настройка для проекта такова:

Активность фрагмента имеет вид видео и вид кнопки на макете. Затем он добавляет фрагмент в контейнер contentView. ContentView исчезает за 1 секунду до окончания воспроизведения видео.

Все работает плавно, и проблема заключается в возврате обратно в приложение после включения и выключения экрана.

Кроме того, иногда видео просто выпадает полностью, оставляя взгляды сидящими на черном фоне.

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

proper rendering of views over video

Здесь артефакт, который происходит, когда вы выключаете экран, снова включаете и разблокируете. Заметьте, что мне пришлось сфотографировать его. В DDMS инструмент скриншота видит изображения правильно.

artifacted image

4b9b3361

Ответ 1

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

В этот момент было бы неплохо вызвать View.invalidate в обоих ваших представлениях, это должно привести к перерисовке. Цепь розыгрыша очень шелушатся, пока экран блокировки не работает, потому что ваше приложение технически доступно, прямо под экраном блокировки.

    registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context ctx, Intent intent) {
            if(intent.getAction().equals(Intent.ACTION_USER_PRESENT))

        }
    }, new IntentFilter(Intent.ACTION_USER_PRESENT));

Ответ 2

Похоже, что макет наложения был сдвинут панелью управления.
Разве вы не думаете, что это повлияло на область управления (play/pause/ff/rew + progress)?

Ответ 3

может быть способ предотвратить выключение экрана в 1-м месте, так как это будет хорошим решением ваших проблем с повторением, надеюсь, что это поможет.