AnZ*_*AnZ 15 android android-video-player android-layout android-mediaplayer
我试图MediaController在方向变化上动态改变锚点.经过我的所有尝试后,这根本不能正常工作.
也许你可以指出我的错误.
简而言之:
肖像模式:
SurfaceView 重量:0.4MediaController和HorizontalScrollView重量:0.6MediaController 总是可见而不是隐藏景观模式:
SurfaceView 重量:0.0(全屏)
MediaControlls= View.Gone(我需要将其锚更改为SurfaceView.并弹出onTouch.但是如何?)
代码:
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>
Run Code Online (Sandbox Code Playgroud)
转换代码:
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了什么:
1)当Landscape:创建另一个mediaController并绑定到根视图(不起作用):
mediaController.setAnchorView(root);
mediaController.setMediaPlayer(player.getPlayerControl());
mediaController.setEnabled(true);
mediaController.show(3);
Run Code Online (Sandbox Code Playgroud)
2)横向时:更改前一个MediaController(Nah)的锚点.
mc.setAnchorView(surfaceWrapper);
mc.show(3);
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
那么如何MediaController将SurfaceView动态锚点更改为动态LANDSCAPE模式?
PS告诉是否需要更多代码.
由于您要重写 onConfigurationChanged,我认为这意味着该 Activity 不允许 Android 管理其方向更改,而是选择自行完成所有操作。这通常不是一个好主意,而您目前正面临着这个决定的痛苦。:-(
如果我可以提出建议:让Android管理您的活动的生命周期,并使用不同的布局(例如layout-land/views.xml和layout-port/views.xml)。这将允许您在 XML 中自然地表达您的布局,而无需进行疯狂的代码更改。
您可能会说:但我希望我的 ExoPlayer 不必在每次方向改变时停止、准备和重新启动。好消息是有一种方法可以解决这个问题。
只需创建一个 ExoPlayer,在第一次加载时准备它,然后在每个新活动实例中继续使用该实例(存储在静态或其他单例中)。您可以将旧活动与其分离,并在新活动准备就绪后重新附加该活动。
如果 ExoPlayer 的工作方式与 MediaPlayer 类似,那么这应该一切正常。
| 归档时间: |
|
| 查看次数: |
1658 次 |
| 最近记录: |