Изменение ориентации Android VideoView с буферизованным видео

Я пытаюсь воспроизвести функциональность последнего приложения YouTube на торговой площадке Android. При просмотре видео есть два отдельных макета: один в портретном, который предоставляет дополнительную информацию, и один в альбомном, который обеспечивает полноэкранный просмотр видео.

YouTube app portrait layout
Приложение YouTupe в портретном режиме

YouTube app landscape layout
Приложение YouTube в ландшафтном режиме

(Извините за случайность фотографий, но это были первые фотографии фактического макета, которые я смог найти)

Обычно это довольно легко сделать - просто укажите альтернативный макет в layout-land, и все будет хорошо. То, что приложение YouTube делает действительно хорошо (и то, что я пытаюсь воспроизвести), заключается в том, что при изменении ориентации видео продолжает воспроизводиться и не требует повторной буферизации с самого начала.

Я понял это переопределение onConfigurationChange () и установка новых LayoutParameters позволят мне изменить размер видео без принудительного повторного буфера - однако видео будет произвольно масштабироваться до разной ширины / высоты при многократном повороте экрана. Я пробовал делать всевозможные вызовы invalidate () в VideoView, пробовал вызывать RequestLayout () в родительском контейнере RelativeLayout и просто пробовал как можно больше разных вещей, но я могу ' Кажется, он не работает должным образом. Мы будем очень благодарны за любой совет!

Вот мой код:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        questionText.setVisibility(View.GONE);
        respond.setVisibility(View.GONE);
        questionVideo.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
    } else {
        questionText.setVisibility(View.VISIBLE);
        respond.setVisibility(View.VISIBLE);
        Resources r = getResources();
        int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150.0f, r.getDisplayMetrics());
        questionVideo.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, height));
    }
}

РЕДАКТИРОВАТЬ: Я обнаружил в logcat некоторые интересные результаты, которые появляются, когда мое видео поворачивается, что, кажется, является виновником - хотя я понятия не имею, как это сделать исправьте это:

вывод Logcat при правильном изменении размера (занимает все окно)

обратите внимание на h = 726

12-13 15:37:35.468  1262  1270 I ActivityManager: Config changed: { scale=1.0 imsi=310/4 loc=en_US touch=3 keys=1/1/2 nav=1/1 orien=2 layout=34 uiMode=17 seq=210}
12-13 15:37:35.561  1262  1268 I TIOverlay: Position/X0/Y76/W480/H225
12-13 15:37:35.561  1262  1268 I TIOverlay: Adjusted Position/X1/Y0/W403/H225
12-13 15:37:35.561  1262  1268 I TIOverlay: Rotation/90
12-13 15:37:35.561  1262  1268 I Overlay : v4l2_overlay_set_position:: w=480 h=224
12-13 15:37:35.561  1262  1268 I Overlay : v4l2_overlay_set_position:: w=402 h=726
12-13 15:37:35.561  1262  1268 I Overlay : dumping driver state:
12-13 15:37:35.561  1262  1268 I Overlay : output pixfmt:
12-13 15:37:35.561  1262  1268 I Overlay : w: 432
12-13 15:37:35.561  1262  1268 I Overlay : h: 240
12-13 15:37:35.561  1262  1268 I Overlay : color: 7
12-13 15:37:35.561  1262  1268 I Overlay : UYVY
12-13 15:37:35.561  1262  1268 I Overlay : v4l2_overlay window:
12-13 15:37:35.561  1262  1268 I Overlay : window l: 1 
12-13 15:37:35.561  1262  1268 I Overlay : window t: 0 
12-13 15:37:35.561  1262  1268 I Overlay : window w: 402 
12-13 15:37:35.561  1262  1268 I Overlay : window h: 726

вывод Logcat при неправильном изменении размера (занимает небольшую часть всего экрана)

обратите внимание на h = 480

12-13 15:43:00.085  1262  1270 I ActivityManager: Config changed: { scale=1.0 imsi=310/4 loc=en_US touch=3 keys=1/1/2 nav=1/1 orien=2 layout=34 uiMode=17 seq=216}
12-13 15:43:00.171  1262  1268 I TIOverlay: Position/X0/Y76/W480/H225
12-13 15:43:00.171  1262  1268 I TIOverlay: Adjusted Position/X138/Y0/W266/H225
12-13 15:43:00.171  1262  1268 I TIOverlay: Rotation/90
12-13 15:43:00.179  1262  1268 I Overlay : v4l2_overlay_set_position:: w=480 h=224
12-13 15:43:00.179  1262  1268 I Overlay : v4l2_overlay_set_position:: w=266 h=480
12-13 15:43:00.179  1262  1268 I Overlay : dumping driver state:
12-13 15:43:00.179  1262  1268 I Overlay : output pixfmt:
12-13 15:43:00.179  1262  1268 I Overlay : w: 432
12-13 15:43:00.179  1262  1268 I Overlay : h: 240
12-13 15:43:00.179  1262  1268 I Overlay : color: 7
12-13 15:43:00.179  1262  1268 I Overlay : UYVY
12-13 15:43:00.179  1262  1268 I Overlay : v4l2_overlay window:
12-13 15:43:00.179  1262  1268 I Overlay : window l: 138 
12-13 15:43:00.179  1262  1268 I Overlay : window t: 0 
12-13 15:43:00.179  1262  1268 I Overlay : window w: 266 
12-13 15:43:00.179  1262  1268 I Overlay : window h: 480

Может быть, кто-то знает, что такое «Оверлей» и почему он не получает правильного значения высоты?

50
задан Mark G. 26 November 2018 в 07:55
поделиться