Перекомпонуйте макет действия для воспроизведения видео в полноэкранном режиме при повороте экрана

В Activity я встроил виджет Video (VideoView или MediaPlayer, связанный с SurfaceView), размер которого следует адаптировать при повороте экрана. Это действие используется в качестве содержимого в TabHost.

Мой нынешний подход

Чтобы справиться с поворотом экрана, я предоставил два макета: один для портретной, а другой - для альбомной ориентации (помещены в папки ./res/layout и ./res/layout-land).

Проблема этого подхода заключается в том, что для каждого поворота создается новое действие, поэтому я не использую один и тот же MediaPlayer (или VideoView) => Я запускаю видео с начала каждый раз, когда поворачиваю экран. Поскольку видео передается из Интернета, невозможно сохранить позицию в видео для поиска этой позиции при перезапуске видео в другом действии.

Что бы я хотел сделать

Мне нужно иметь возможность переводить / масштабировать / скрывать представления внутри Activity при повороте экрана. При переводе / масштабировании необходимо поддерживать организацию макета, чтобы макет был адаптирован к разным размерам экрана.

Желаемая анимация / макет

Мои вопросы

  • Как перевести / переместить просмотры в верхнее левое положение экрана?
  • Как скрыть / перевести View за пределы экрана, чтобы View исчез?
  • Как масштабировать / изменять размер представления, чтобы отрегулировать его размер в соответствии с доступным пространством вокруг него?

  • Какой интерфейс и обратный вызов мне нужно реализовать, чтобы получать уведомления о повороте экрана для запуска этих преобразований?


person Bertrand    schedule 08.03.2011    source источник
comment
+1 за очень красивую постановку вопроса ........   -  person N-JOY    schedule 08.03.2011


Ответы (1)


Наконец-то я нашел хороший способ сделать это. В документации Android указано, что когда вам нужно обработать изменения (ориентация, клавиатура ...) без воссоздания нового Activity, вы должны сделать это, переопределив метод onConfigurationChanged класса Activity. Вы должны указать изменения, которые вы считаете разумными, в файле манифеста вашей деятельности.

Дополнительную информацию об этом можно найти здесь.

В моем случае манифест моей активности выглядит так:

<activity android:name=".MyActivity" android:configChanges="orientation"></activity> 

А внутри MyActivity Activity я добавил следующий метод:

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        int visibility = View.VISIBLE;
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            visibility = View.GONE;
        }
        getTabHost().getTabWidget().setVisibility(visibility);
    }

со следующим макетом для моей деятельности:

<?xml version="1.0" encoding="utf-8"?>
<TabHost
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <LinearLayout
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent">

      <TabWidget
          android:id="@android:id/tabs"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content" />

      <FrameLayout
          android:id="@android:id/tabcontent"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent" />

    </LinearLayout>

</TabHost>

Таким образом, когда я скрываю / показываю панель tabWidget, размер VideoView (который добавляется к содержимому TabHost) изменяется, а в альбомной ориентации у меня есть полноэкранный режим для просмотра фильма.

Я надеюсь, что это поможет некоторым из вас.

person Bertrand    schedule 08.03.2011