Освой Android играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Технология "Picture in Picture" позволяет свернуть содержимое активности (обычно это видео) в маленькое окно в углу экрана в режиме "поверх всех окон". При этом вы можете пользоваться другим приложением, а видео будет продолжать воспроизводиться.
Нечто подобное сначала появилось в версии Android Nougat для Android TV. В Android Oreo такая возможность появилась и для мобильных устройств.
Чтобы включить режим "Картинка в картинке", нужно добавить атрибут android:supportsPictureInPicture для активности в манифесте, а также несколько вспомогательных атрибутов для удобства.
<activity
android:name=".MainActivity"
android:launchMode="singleTask"
android:supportsPictureInPicture="true"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
... />
Атрибут android:launchMode со значением singleTask позволит избежать создания дубликатов экрана активности. Атрибут android:configChanges позволит избежать пересоздания активности при различных условиях: поворота, изменения размера и др.
Осталось создать макет экрана активности и поместить на него кнопку, которая запустит режим "Картинка в картинке". Используйте свой вариант, только добавьте идентификатор для корневого элемента для вычисления его размеров.
Код для щелчка кнопки.
public void onClick(View view) {
if (android.os.Build.VERSION.SDK_INT >= 26) {
ConstraintLayout constraintLayout = findViewById(R.id.root_layout);
Rational rational = new Rational(constraintLayout.getWidth(),
constraintLayout.getHeight());
PictureInPictureParams mParams =
new PictureInPictureParams.Builder()
.setAspectRatio(rational)
.build();
enterPictureInPictureMode(mParams);
}
}
После нажатия на кнопку активность свернётся в маленький прямоугольник. Если щёлкнуть по заголовку свёрнутого прямоугольника приложения, то откроется окно настроек "Картинка в картинке" для данного приложения. Если щёлкнуть в основной части прямоугольника, то приложение откроется в своём первоначальном размере.
Вы можете задать собственные размеры для свёрнутого прямоугольника, используя класс Rational. Просто подставьте свои случайные значения, чтобы увидеть поведение приложения.
Метод enterPictureInPictureMode() можно вызвать без всяких параметров.
Чтобы отследить момент перехода активности в режим "Картинка в картинке", используйте метод onPictureInPictureModeChanged(). В этом методе вы можете скрыть лишние компоненты экрана, оставив только видео.
@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);
if (!isInPictureInPictureMode) {
button.setVisibility(View.VISIBLE);
} else {
// прячем кнопку в режиме PIP
button.setVisibility(View.GONE);
}
}
Осталось разобраться с ещё одним моментом из жизненного цикла активности. Когда приложение переходит в режим PIP, то активность ставится в состояние "Пауза" и вызывается метод onPause(). Обычно в этом месте приостанавливается воспроизведение видео, но в данном случае мы не хотим приостанавливать проигрывание контента. Чтобы избежать противоречия, вызывайте для проверки метод isInPictureInPictureMode().
@Override
protected void onPause() {
super.onPause();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
&& isInPictureInPictureMode()) {
// Continue playback...
}
// Not in PIP & Activity is paused. Pause playback if required....
}
googlesamples/android-PictureInPicture - официальный пример