Как перевести SurfaceView по оси Y или установить для него отрицательное поле?

В моем макете есть SurfaceView (представляющий видео в пользовательской реализации ExoPlayer).

Я хочу переместить его на 100 пикселей вверх (чтобы он покидал экран вверху).

Я уже пробовал разные способы сделать это, и ни один не работал:

  • настройка полей индивидуально (через MarginLayoutParams),
  • используя setMargins (с 4 параметрами),
  • используя .setTranslationY(...), но также и .animate().translationY(...),
  • применение переводов с анимацией (с продолжительностью, а также установкой ее на 0),
  • установка переводов и отрицательных полей через xml (предварительный просмотр выглядит хорошо, но не во время выполнения),
  • вложение с LinearLayout / RelativeLayout в качестве прямого родителя,
  • применяя изменения к его прародителю FrameLayout.

Я заметил, что если я применяю эти изменения к любому другому элементу, они корректно перемещаются вверх, но не SurfaceView.

Я даже смог анимировать переводы, чтобы элементы представления появлялись в верхней части экрана и располагались в углу.

Почему это происходит? Это ограничение самого класса SurfaceView?

Я не мог найти много информации об этом. Только это кажется связанным: Перемещение SurfaceView (с предварительным просмотром камеры) влево от экрана

Текущее поведение:

Видеоплеер (обозначенный SurfaceView) сжат/сжат.

то есть высота плеера уменьшается, оставляя место внизу, но этот элемент никогда не покидает экран вверху

Ожидаемое поведение:

Другие элементы перемещаются вверх и покидают экран, когда мы устанавливаем для них отрицательные верхние поля или отрицательные переводы по оси Y.


person JCarlosR    schedule 06.04.2021    source источник