Intereting Posts
Центрирование элементов в RecyclerView, когда оно реализовано с помощью GridLayoutManager Как уменьшить время, затрачиваемое MPAndroidChart для отображения данных? Работает ли butterknife 7.x с Kotlin M14? Почему PendingIntent не отправляет мою настраиваемую настройку Extras для Intent? Изменить конфигурацию Mipmap vs drawable folders Android доступны mime-типы? «Это приложение доступно для более чем 0 устройств». Как создать Raw-сокет в Android? Что происходит с выполнением JavaScript (settimeout и т. Д.), Когда iPhone / Android ложится спать? ANDROID – обработка dx слишком медленно Как решить «Код версии вашего APK должен быть выше 2.» в консоли разработчика Google Play? Как подавить предупреждение «Может быть заменено предупреждением foreach» Разница между активностью и фрагментацией Отмена регистрации и повторная регистрация сообщений 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, тогда все должно работать нормально.