В Android, используя exoplayer, как заполнить обзор поверхности видео, которое не имеет одинакового соотношения сторон с устройством?
У меня есть активность, которая использует ExoPlayer для воспроизведения видео. Когда я вхожу в полноэкранный режим, если соотношение сторон устройства не равно размеру изображения, я получаю маленькие черные полосы вверху и внизу видео.
Вот как выглядит макет:
<com.google.android.exoplayer.AspectRatioFrameLayout
android:id="@+id/video_frame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true">
<SurfaceView android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="fill_vertical"/>
<View android:id="@+id/shutter"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black"/>
</com.google.android.exoplayer.AspectRatioFrameLayout>
Я надеялся, что
aspectRatioFrameLayout.setAspectRatio(mVideo.getAspectRatio());
решит проблему, но я не имел успеха.
Есть ли способ заполнить экран видео, даже если часть видео отключена с экрана?
Ответы
Ответ 1
Вы можете удалить com.google.android.exoplayer.AspectRatioFrameLayout
.
Затем добавьте простой FrameLayout
с шириной и высотой на match_parent
.
Обратите внимание, что SurfaceView
должен оставаться в ширине и высоте = match_parent
.
Объяснение: AspectRatioFrameLayout
устанавливает правильную высоту представления в соответствии с реальным соотношением видео (вычисление на основе ширины, высоты и pixelRatio). Если вы этого не сделаете, Exoplayer все еще может отображать представление на SurfaceView
, как это было раньше. Если SurfaceView
не @Override
, он не будет иметь соотношение сторон.
Ответ 2
Самый быстрый способ заполнить экран видео.
Перейдите в класс SimpleExoPlayerView.java
, измените resizeMode
с AspectRatioFrameLayout.RESIZE_MODE_FIT
на AspectRatioFrameLayout.RESIZE_MODE_FILL
.
RESIZE_MODE_FILL
будет игнорировать указанное соотношение сторон.
Используйте этот способ, если вы используете ExoPlayer в качестве модуля в своем проекте.
ОБНОВЛЕНО
Если вы используете ExoPlayer в качестве библиотеки, у них есть метод setResizeMode()
.
Вы просто указали на AspectRatioFrameLayout.RESIZE_MODE_FILL
в своем представлении:
simpleExoPlayerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL)
Это все!
Ответ 3
Это можно сделать и в XML, если вы используете SimpleExoPlayerView
.
Просто добавьте app:resize_mode="zoom"
чтобы сохранить соотношение сторон видео, или app:resize_mode="fill"
если вас не интересует соотношение сторон.
<com.google.android.exoplayer2.ui.SimpleExoPlayerView
android:id="@+id/video"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:resize_mode="zoom" />
Ответ 4
Просто используйте ниже линию в вашем XML. Это будет отлично работать.
app:resize_mode="fill"