Exo Player становится черным при анимации фрагмента контейнера, как это исправить?
У меня есть представление Exoplayer во фрагменте, когда я анимирую представление контейнера фрагмента из активности, exo player станет черным.
я использовалsetKeepContentOnPlayerReset(true);
чтобы сохранить последний кадр, и он работает нормально.
Но когда я вызываю анимацию (скользящую анимацию) в представлении контейнера фрагментов (это макет кадра) после окончания видео, проигрыватель Exo отображает черный экран. (даже переход при выходе из фрагмента также создает ту же проблему в проигрывателе Exo, на этот раз я не заменил фрагмент, просто анимировал представление контейнера, проблема все еще присутствует)
Я не имею никакого отношения к этой проблеме, это было бы очень полезно, если кто-нибудь может поделиться какой-либо идеей, связанной с этим. приветствует все предложения и ответы, связанные с этим. Спасибо.
2 ответа
Оказалось, что при использовании "texture_view
" за "app:surface_type
"решит проблему. Это заставит игрока Exo использовать вид текстуры вместо вида поверхности, что сделает анимацию и прокрутку плавными.
В документации говорится
В более ранних выпусках это могло привести к нежелательным эффектам, когда SurfaceView помещался в контейнер с прокруткой или когда он подвергался анимации. Такие эффекты включают в себя содержимое SurfaceView, которое немного отстает от того места, где оно должно отображаться, и отображение черного при анимации.
В файле xml мы можем включить просмотр текстуры следующим образом
<com.google.android.exoplayer2.ui.SimpleExoPlayerView
android:id="@+id/playerView"
android:layout_width="match_parent"
android:layout_height="200dp"
app:surface_type="texture_view"/>
вы можете использовать эти 2 решения ...
добавьте этот атрибут в PlayerView:
app:surface_type="texture_view"
используйте это в своем коде:
val simpleExoPlayer = SimpleExoPlayer.Builder(requireContext()) .setMediaSourceFactory( DefaultMediaSourceFactory(requireContext()) ) .build() simpleExoPlayer.addAnalyticsListener(object : AnalyticsListener { override fun onSurfaceSizeChanged( eventTime: AnalyticsListener.EventTime, width: Int, height: Int ) { super.onSurfaceSizeChanged(eventTime, width, height) val surfaceView = playerView.videoSurfaceView if (surfaceView is SurfaceView) { surfaceView.holder.setFixedSize(width, height) } } })