更改媒体控制器在旋转位置

我试图改变MediaController的方向变化dynamic锚点。 而且,毕竟我的这个尝试不是按照需要进行的。

也许你可以指出我的错误。

简单来说:

肖像模式:

  1. weightSum = 1。
  2. SurfaceView重量:0.4
  3. MediaControllerHorizontalScrollView重量:0.6
  4. MediaController始终可见,不会隐藏

风景模式:

  1. SurfaceView重量:0.0(全屏)

  2. MediaControlls = View.Gone (我需要将其锚点更改为SurfaceView ,然后popuponTouch,但是如何?)


代码:

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)当风景:创build另一个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); } } 

那么我怎么能在LANDSCAPE模式下dynamic地将MediaController的锚点更改为SurfaceView呢?

PS告诉是否需要更多的代码。

Solutions Collecting From Web of "更改媒体控制器在旋转位置"

既然你重写了ConfigChanged,我认为这意味着这个活动不允许Androidpipe理它的方向改变,而是select自己做所有事情。 这通常不是一个好主意,你目前正面临着这个决定的痛苦。 🙁

如果我可以提出build议:让Androidpipe理您的活动的生命周期,并使用不同的布局(例如layout-land / views.xml和layout-port / views.xml)。 这将允许您自然地在XML中表示布局,而不必疯狂地更改代码。

您可能要说:但是我希望我的ExoPlayer不必停止,准备和重新启动每个方向的变化。 好消息是有办法解决这个问题。

只需创build一个ExoPlayer,在第一次加载时准备好,并且每个新的活动实例继续使用该实例(存储在静态或其他单例中)。 您可以从中分离旧的活动,并在准备就绪时重新附加一个新活动。

如果ExoPlayer与MediaPlayer类似,那么这应该都可以。