19-9-1-android强制转屏

Android

Posted by Wangchenchen on 2019-09-01

在项目中因为有个播放界面用到了强制转屏,就记录以下,顺便在将 自动转屏也尝试弄出来,一起做个记录;

强制转屏:

两个方法:

​ 1:在Activity的onCreate()中设置:

竖屏:

1
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

横屏:

1
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

默认:

1
2

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

​ 2:.在AndroidManifest.xml对每个Activity进行配置+xml添加设置:

androidMainfest.xml

1
2
3
4
5
6
7
8
<activity android:name=".MainActivity"
android:configChanges="orientation|keyboard">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

xml

1
2
android:screenOrientation="landscape"横屏设置;
android:screenOrientation="portrait"竖屏设置;
转屏数据处理

​ 手动切换横屏和竖屏后,由于长宽的变化数据就会产生变化;

​ 1,layout-land和layout-port

​ 在res目录下建立两个目录分别是layout—land(横屏数据) layout-port(竖屏的layout)相应的文件不变,android模拟器会自动通过横竖屏找到相对应的layout

​ 2.onCreate()中判断横竖屏

​ 通过this.getResources().getConfiguration().orientation判断当前是横屏还是竖屏,然后加载相应的xml布局文件。因为当屏幕变为横屏的时候,系统会重新呼叫当前Activity的OnCreate方法,你可以把以下方法放在你的 OnCreate中来检查当前的方向,然后可以让你的SetContentView来载入不同的Layout xml.

1
2
3
4
5
6
7
if (this.getResources().getConfiguration().orientation==
Configuration.ORIENTATION_LANDSCA{
Log.i("info", "landscape");
}elseif(this.getResources().getConfiguration().orientation==
Configuration.ORIENTATION_ORTRAIT) {
Log.i("info", "portrait");
}

​ 3.这是最后一个也是最重要的一个,由于项目是视频不想在转化的时候出现黑屏和内容重新播放的情况,所以结合OrientationEventListener,自定义旋转监听设置;

​ 首先,创建OrientationEventListener对象:

1
2
3
4
private OrientationEventListener mOrientationListener;
// screen orientation listener
private boolean mScreenProtrait = true;
private boolean mCurrentOrient = false;

​ 自定义回调接口:

1
abstract protected void OrientationChanged(int orientation);

​ 自定义监听类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private final void startOrientationChangeListener() {
mOrientationListener = new OrientationEventListener(this) {
@Override
public void onOrientationChanged(int rotation) {
if (((rotation >= 0) && (rotation <= 45)) || (rotation >= 315)|| ((rotation>=135)&&(rotation<=225))) {//portrait
mCurrentOrient = true;
if(mCurrentOrient!=mScreenProtrait){
mScreenProtrait = mCurrentOrient;
OrientationChanged(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Log.d(TAG, "Screen orientation changed from Landscape to Portrait!");
}
}
else if (((rotation > 45) && (rotation < 135))||((rotation>225)&&(rotation<315))){//landscape
mCurrentOrient = false;
if(mCurrentOrient!=mScreenProtrait){
mScreenProtrait = mCurrentOrient;
OrientationChanged(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Log.d(TAG, "Screen orientation changed from Portrait to Landscape!");
}
}
}
};
mOrientationListener.enable();
}

​ 在onCreate()中调用:

1
startOrientationChangeListener();
生命周期

启动一个Activity,

onCreate()

onStart()

onResume()

竖屏切换到横屏:(调用一次生命周期)

onSaveInstanceState()

onPause()

onStop()

onDestroy()

onCreate()

onStart()

onRestoreInstanceState()

onResume()

横屏切换到竖屏:(调用两次生命周期)

onSaveInstanceState()

onPause()

onStop()

onDestroy()

onCreate()

onStart()

onRestoreInstanceState()

onResume()

onSaveInstanceState()

onPause()

onStop()

onDestroy()

onCreate()

onStart()

onRestoreInstanceState()

onResume()

设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次。

设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。

关于通过手机内置陀螺仪转屏还没有弄明白,如果搞清楚会在开一篇新的内容记录;

感谢

https://blog.csdn.net/JugglerTao/article/details/51782801

https://blog.csdn.net/dj0379/article/details/50906843

如果有人能够看到,欢迎提意见 ^o^王晨晨:jsntwangchenchen@outlook.com