Я работаю над режимом PiP в моем приложении.На самом деле он работает довольно хорошо, но у меня проблема с миганием / исчезновением видео на долю секунды.
У меня VideoActivity в «полноэкранном» / нормальном режиме.Я звоню enterPictureInPictureMode();
и Activity
рушится на маленький PiP-кадр.В тот момент, когда анимация заканчивается уменьшением макета, видео становится прозрачным за доли секунды / один кадр.Также точно в этом кадре весь PiP-кадр получает тень под (возвышением).Когда я касаюсь этого маленького PiP-кадра, он немного расширяется до большого PiP-кадра (не полноэкранного), и эта анимация плавная, но при автоматическом сворачивании в маленький PiP-кадр он снова мигает в конце ... Каждый раз, когда Activity
анимирует на маленький PiP-кадр (независимо от того, разваливается ли он на большом PiP-кадре или в полноэкранном режиме Activity
), при достижении конечных «маленьких границ» происходит мигание одного кадра прозрачности.Не влияет на звук, видео воспроизводится стабильно, нет вызовов на onPlayerStateChanged
.
. В более новой версии API мы можем создавать анимацию с границами, и поэтому я знаю, что видео view мигает.Использование метода без атрибутов приводит к свертыванию всего макета, и я вижу мерцание только в области с видео / плеером / видом на поверхность (черные полосы над и под видео).Когда я использую более новый метод и setSourceRectHint
, я вижу, что весь PiP-кадр исчезает без учета черного фона его родителя.На самом деле я добавил фиктивный View
с фиксированным размером, цветом фона и centerInParent
как PlayerView
- он мигает / прячется, как игрок, когда находится ниже (первый в родительском элементе) PlayerView
слой, но помещенный выше , не мигает вообще и показывает выше PlayerView
, даже если он исчезает на долю секунды.
Как исправить это мигание или, возможно, установить черный фон,не прозрачный ...
if (Build.VERSION.SDK_INT >= 26) {
Rect bounds = new Rect();
playerView.getVideoSurfaceView().getDrawingRect(bounds);
int toTop = (playerView.getMeasuredHeight() - bounds.height()) / 2,
toLeft = (playerView.getMeasuredWidth() - bounds.width()) / 2;
bounds.top += toTop;
bounds.left += toLeft;
bounds.bottom += toTop;
bounds.right += toLeft;
enterPictureInPictureMode(new PictureInPictureParams.Builder().
setSourceRectHint(bounds).
setAspectRatio(new Rational(bounds.width(), bounds.height())).
build());
} else
enterPictureInPictureMode();
xml:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black">
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/activity_video_player_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:background="@android:color/black"
app:controller_layout_id="@layout/exo_custom_control_view"
app:fastforward_increment="10000"
app:rewind_increment="10000"
app:show_timeout="100" />
...
PS.Вышеуказанная проблема также появляется при использовании обычного VideoView
, воспроизводимого в WebView
и переходящего в полноэкранный режим с помощью VideoEnabledWebChromeClient .Но в этом случае мигание раскрывается для доли секунды WebView
s содержимого
edit: я только что нашел обходной путь для мигания ExoPlayer - заменив SurfaceView
на TextureView
, добавив app:surface_type="texture_view"
- но я читаю, что TextureView
немного менее эффективен, а также это не исправляет VideoView
мигание (в полноэкранном режиме с WebView
)
edit2: может подтвердить мигание на Android 8 (Xiaomi) и9 (пиксель)