视频播放过程中的横竖屏切换

最近在优化视频播放体验,需要实现视频的横竖屏自动及手动切换,先看看交互原型图

最佳体验

  1. 通过点击右下角按钮可以实现横竖屏切换;
  2. 当手机的横竖屏开关打开,可以通过旋转手机实现自动横竖屏切换;
  3. 当手机的横竖屏开关关闭,实现同方法1。

之前的实现思路是将竖屏的Activity的方向写死为竖屏,点击全屏按钮,跳转到另一个Activity实现全屏播放,这种方法是很有问题的,首先我们不能通过手势转换屏幕实现横竖屏自动切换,其次,在切换横竖屏的过程中要保证播放的连续性,我们必须要对当前的视频维护一个单一的 MediaPalyer,显然这样做太麻烦了,下面来讲第二种思路

通过横竖屏切换,在切换过程中对页面进行适配

关于横竖屏切换过程中Activity生命周期的变化大家可以去网上搜一搜,这里就不说了,我这边采取了是非重启Activity的横竖屏切换,也就是在AndroidManifest.xml注册Activity的时候设置 android:configChanges="orientation|screenSize|keyboardHidden",这样在屏幕旋转的时候只会执行onConfigurationChanged方法

首先,我们需要在onCreate方法中执行一下这句话,因为Activity默认是unspecified,不设置的话,当手机屏幕旋转开关打开的情况下旋转屏幕,手机不会自动旋转

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);

然后是手动切换横竖屏的点击

1
2
3
4
5
if (mIsLandscape == false) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

最好看一下onConfigurationChanged中的执行方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
private boolean mIsLandscape = false;
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {//横屏
//设置全屏即隐藏状态栏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
mIsLandscape = true;
//横屏 视频充满全屏
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) mFleader.getLayoutParams();
layoutParams.height = LinearLayout.LayoutParams.MATCH_PARENT;
layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT;
mFleader.setLayoutParams(layoutParams);
mWebView.setVisibility(View.GONE);
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
//恢复状态栏
WindowManager.LayoutParams attrs = getWindow().getAttributes();
attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().setAttributes(attrs);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); mIsLandscape = false;
//竖屏 视频显示固定大小
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) mFleader.getLayoutParams();
layoutParams.height = ViewUtils.dip2px(activity, 208);
layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT;
mFleader.setLayoutParams(layoutParams);
//显示图文内容
mWebView.setVisibility(View.VISIBLE);
}
}

通过上面的处理就可以实现视频的横竖屏播放,且不用担心播放的连续性

但是这样还会出现一个问题,在手动切换后,如果我们再切换系统转屏的开关,状态就会乱掉,所以需要第一时间监测开关,并改变当前的设置,方法如下:

在页面初始化的时候注册系统转屏的监听

1
2
3
4
5
6
7
8
9
10
11
12
13
//注册 Settings.System.ACCELEROMETER_ROTATION
getContentResolver().registerContentObserver(Settings.System.getUriFor(Settings.System.ACCELEROMETER_ROTATION),true, rotationObserver);
private ContentObserver rotationObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
if (selfChange) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
}
}
};

这样即可完美实现视频播放过程中的横竖屏切换体验。最好不要忘了在onDestroy中关闭监听

getContentResolver().unregisterContentObserver(rotationObserver);