Intereting Posts
Проект «appcompat_v7» создается автоматически после создания нового проекта в Eclipse Android: Как включить / отключить пункт меню выбора при нажатии кнопки? Запрос и разрешение WRITE_EXTERNAL_STORAGE во время выполнения не влияет на текущий сеанс Как обрабатывать несколько маркеров на Картах Google в одном месте? Robolectric vs Android Framework для тестирования Перетаскивание в android 3.x вызывает незаконное появлениеStateException после небольшого числа при перетаскивании Тихая установка apk программно с помощью системного приложения (без root) Фрагментация памяти GC GC не выполняется. Обходной путь? В чем разница между Eclipse «Импорт» и «Создать проект из существующего источника» для проектов Android? Как получить абсолютные координаты вида Настройте android EditText, чтобы разрешить десятичные и отрицательные значения Перехват ссылок из браузера, чтобы открыть приложение для Android «Это приложение не будет запускаться, если вы не обновите оповещение Google Play Services» FrameLayout против RelativeLayout для наложений ID регистрации андроида GCM макс. Длина

Изменение положения MediaController при вращении

Я пытаюсь изменить MediaController динамически на изменения ориентации. И после всех моих попыток это не работает по мере необходимости.

Возможно, вы могли бы указать на мою ошибку.

В нескольких словах:

Портретный режим:

  1. WeightSum = 1.
  2. SurfaceView вес: 0.4
  3. MediaController и HorizontalScrollView вес: 0.6
  4. MediaController всегда видимый и не скрывающий

Ландшафтный режим:

  1. SurfaceView вес: 0.0 (полный экран)

  2. MediaControlls = View.Gone (мне нужно изменить SurfaceView к SurfaceView и всплывающее окно, но как?)


КОД КОДА:

player.xml:

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/root" android:layout_width="match_parent" android:layout_height="match_parent" android:keepScreenOn="true" tools:context="tenkol.design.com.imbrecords.ActivityExoPlayer" android:weightSum="1" android:orientation="vertical"> <FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/surface_wrapper" android:layout_weight="0.4"> <com.google.android.exoplayer.VideoSurfaceView android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" /> <View android:id="@+id/shutter" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/black" /> </FrameLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="0.6" android:orientation="vertical"> <FrameLayout android:id="@+id/controls_wrapper" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="2dp"> </FrameLayout> <HorizontalScrollView android:id="@+id/myGallery" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="0dp"> <LinearLayout android:id="@+id/channelsScrollView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:orientation="horizontal" android:paddingBottom="5dp" android:paddingTop="5dp" /> </HorizontalScrollView> </LinearLayout> </LinearLayout> 

Код с преобразованием:

 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (Global.getScreenOrientation(this) == Configuration.ORIENTATION_LANDSCAPE) { //hide action bar getSupportActionBar().hide(); if (myGallery != null) { //hide HorizontalScrollView myGallery.setVisibility(View.GONE); } //make surface fullscreen surfaceWrapper.setLayoutParams(new LinearLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT, 0f)); controlsWrapper.setLayoutParams(new LinearLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT, 0f)); //hide mediaController mc.hide(); controlsWrapper.setVisibility(View.GONE); } if (Global.getScreenOrientation(this) == Configuration.ORIENTATION_PORTRAIT) { //and here restore everything getSupportActionBar().show(); if (myGallery != null) { myGallery.setVisibility(View.VISIBLE); } surfaceWrapper.setLayoutParams(new LinearLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT, FrameLayout.LayoutParams.FILL_PARENT, 0.4f)); controlsWrapper.setLayoutParams(new LinearLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT, 0.6f)); controlsWrapper.setVisibility(View.VISIBLE); } } 

То, что я пробовал:

1) Когда пейзаж: создайте другой mediaController и привяжите его к корневому представлению (не работает):

  mediaController.setAnchorView(root); mediaController.setMediaPlayer(player.getPlayerControl()); mediaController.setEnabled(true); mediaController.show(3); 

2) Когда пейзаж: измените якорь предыдущего MediaController (Nah).

  mc.setAnchorView(surfaceWrapper); mc.show(3); 

3) интерфейс surfaceChanged (все еще нет):

 @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if (Global.getScreenOrientation(this) == Configuration.ORIENTATION_LANDSCAPE) { mc.setAnchorView(surfaceWrapper); mc.setMediaPlayer(player.getPlayerControl()); mc.setVisibility(View.VISIBLE); mc.show(3); } } 

Итак, как я могу изменить SurfaceView MediaController к SurfaceView динамически в режиме SurfaceView ?

PS Скажите, нужен ли еще какой-то код.

Solutions Collecting From Web of "Изменение положения MediaController при вращении"

Поскольку вы переопределяете onConfigurationChanged, я предполагаю, что это означает, что активность не позволяет Android управлять своими изменениями ориентации и вместо этого выбирать делать все сами. Это, как правило, не очень хорошая идея, и в настоящее время вы столкнулись с болью этого решения. 🙁

Если я могу сделать рекомендацию: пусть Android управляет жизненным циклом вашей деятельности и использует разные макеты (например, layout-land / views.xml и layout-port / views.xml). Это позволит вам выражать свои макеты, естественно, в XML без необходимости делать сумасшедшие изменения кода.

Вероятно, вы собираетесь сказать: Но я хочу, чтобы мой ExoPlayer не должен был останавливаться, готовиться и перезапускаться при каждом изменении ориентации. Хорошей новостью является то, что есть способ обойти это.

Просто создайте один ExoPlayer, подготовьте его при первой загрузке и продолжайте использовать один экземпляр (хранящийся в статическом или некотором другом синглете) с каждым новым экземпляром действия. Вы можете отделить старую активность от нее и снова прикрепить ее, когда она будет готова.

Если ExoPlayer работает аналогично MediaPlayer, тогда все должно работать нормально.