整理转载自ticktick
在对应的activity中,重载函数onConfigurationChanged1
2
3
4@Override
public voidonConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
在该函数中可以通过两种方法检测当前的屏幕状态:
判断newConfig是否等于
1
2Configuration.ORIENTATION_LANDSCAPE,
Configuration.ORIENTATION_PORTRAIT当然,这种方法只能判断屏幕是否为横屏,或者竖屏,不能获取具体的旋转角度.
调用
1
this.getWindowManager().getDefaultDisplay().getRotation();
该函数的返回值,有如下四种:
1
2
3
4Surface.ROTATION_0,
Surface.ROTATION_90,
Surface.ROTATION_180,
Surface.ROTATION_270其中,Surface.ROTATION_0 表示的是手机竖屏方向向上,后面几个以此为基准依次以顺时针90度递增.
Bug: 它只能一次旋转90度, 如果你突然一下子旋转180度, onConfigurationChanged函数不会被调用.
实时判断屏幕旋转的每一个角度
上面说的各种屏幕旋转角度的判断至多只能判断 0, 90 , 180, 270 四个角度,如果希望实时获取每一个角度的变化,则可以通过OrientationEventListener 来实现.
创建一个类继承OrientationEventListener
1
2
3
4
5
6
7
8
9public class MyOrientationDetector extends OrientationEventListener{
public MyOrientationDetector( Context context ) {
super(context );
}
@Override
public void onOrientationChanged(int orientation) {
Log.i("MyOrientationDetector ","onOrientationChanged:"+orientation);
}
}开启和关闭监听
可以在 activity 中创建MyOrientationDetector 类的对象,注意,监听的开启的关闭,是由该类的父类的 enable() 和 disable() 方法实现的.
因此,可以在activity的
onResume() 中调用MyOrientationDetector 对象的 enable方法,
onPause() 中调用MyOrientationDetector 对象的 disable方法来完成功能.监测指定的屏幕旋转角度
MyOrientationDetector类的onOrientationChanged 参数orientation是一个从0~359的变量,如果只希望处理四个方向,加一个判断即可:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20if(orientation == OrientationEventListener.ORIENTATION_UNKNOWN) {
return; //手机平放时,检测不到有效的角度
}
//只检测是否有四个角度的改变
if( orientation > 350 || orientation< 10 ) { //0度
orientation = 0;
}
else if( orientation > 80 &&orientation < 100 ) { //90度
orientation= 90;
}
else if( orientation > 170 &&orientation < 190 ) { //180度
orientation= 180;
}
else if( orientation > 260 &&orientation < 280 ) { //270度
orientation= 270;
}
else {
return;
}
Log.i("MyOrientationDetector ","onOrientationChanged:"+orientation);