Android SurfaceView вызывает мерцание экрана

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

Мой первый Fragment содержит SurfaceView и MediaPlayer, которые питают его, а также различные элементы управления воспроизведением. Моя проблема возникает, когда я перехожу от фрагмента 1 (с SurfaceView) к фрагменту 2 (пустой в данный момент). Если я еще не позвонил start(), ничего необычного не происходит, и я могу нормально листать фрагменты. Однако, как только я вызываю start(), весь экран начинает мигать, когда я перехожу к следующему Fragment, даже если я перевел MediaPlayer в состояние ожидания и он не передает кадры на SurfaceView. Единственное, что может остановить это, — это уничтожить поверхность вместе с содержащимся представлением, проведя пальцем к третьему Fragment, чтобы FragmentPagerAdapter уничтожило Fragment, или выйти из приложения с помощью кнопки «Домой» или «Назад», чтобы представление было уничтожено.

Я не могу понять, почему это происходит, кроме того, что, возможно, поток рендеринга SurfaceView каким-то образом мешает основному потоку пользовательского интерфейса. В LogCat также не появляется ничего необычного, поэтому я немного застрял. Я использую Galaxy Nexus с Android 4.1 в качестве тестового оборудования.

Любая помощь будет оценена по достоинству!

JT

ОБНОВЛЕНИЕ: мне удалось найти временное решение, переопределив метод setPrimaryItem() в FragmentPagerAdapter для вызова метода, который удаляет SurfaceView из иерархии (используя removeView() в контейнере LinearLayout), когда видеоплеер Fragment перестает отображаться, а затем восстанавливает SurfaceView, когда он снова становится активным. К сожалению, когда это происходит, все еще немного мигает, поэтому, если у кого-то есть дополнительные мысли, я был бы признателен!


person Psiloc    schedule 02.09.2012    source источник
comment
проверьте этот ответ. ваша проблема похожа на эту: Link   -  person RATHI    schedule 16.04.2017


Ответы (1)


Из блога разработчиков Android

Этот виджет [SurfaceView] работает, создавая новое окно, расположенное за окном вашего приложения. Затем он пробивает дыру в окне вашего приложения, чтобы открыть новое окно.

Поскольку содержимое SurfaceView не находится в окне приложения, его нельзя эффективно преобразовать (переместить, масштабировать, повернуть). Это затрудняет использование SurfaceView внутри ListView или ScrollView.

Решение состоит в том, чтобы использовать TextureView, если вы создаете версию 4.0 или выше. Если вы заинтересованы в использовании TextureView для отображения видео, этот поток может быть полезен

person Akash    schedule 14.02.2013
comment
Потрясающий ответ .... Я потратил 1 неделю на решение этой проблемы ..... наконец удалил SurfaceView / VideoView и использовал TextureView. - person Atul Bhardwaj; 19.02.2016