在设置界面为sensorLandscape时,会出现屏幕在横屏中有横屏正向和横屏反向之间的切换(以手机竖屏正放,逆时针方向旋转的角度90度和270度),但通常会需要知道这两者之间自由切换时所触发的事件,并按照需求对切换时进行相关操作。
对于监听屏幕方向旋转(手机旋转角度变化)自然而然就想到了利用方向监听事件:OrientationEventListener。实现接口OrientationEventListener并传递会事件到方法onOrientationChanged(int orientation)中,回调参数orientation为旋转角度,其具体实现代码如下:
OrientationEventListener mOrientationListener = new OrientationEventListener(mActivity.getApplicationContext()) {
@Override
public void onOrientationChanged(int orientation) {
if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) {
return; //手机平放时,检测不到有效的角度
}
//只检测是否有四个角度的改变
if (orientation > 340 || orientation < 20) { //0度
} else if (orientation > 70 && orientation < 110) { //90度
}
} else if (orientation > 160 && orientation < 200) { //180度
} else if (orientation > 250 && orientation < 290) { //270度
}
}
}
};
创建监听事件OrientationEventListener实例后,在适当位置进行注册/取消注册监听即可,如Activity中OnResume、OnPause进行注册(enable)和取消注册(disable)。
使用方向变化(OrientationEventListener)进行进行监听,的确是有效果,但你会发现手机屏幕还没彻底旋转过去(意思是该方法并不能准确判断屏幕已经彻底旋转切换成功,存在很大的差异,并未能如愿实现想要的监听结果)。
此处为大家提供一种准确的屏幕旋转自动切换监听方案:利用SensorManager对接口SensorEventListener进行注册并实现SensorEventListener接口中的onSensorChanged(SensorEvent event)和onAccuracyChanged(Sensor sensor, int accuracy)方法。
1、由于SensorManager只对API 14以上起作用,因此先判断当前android设备版本是否符合要求
/**
* 判断当前设备android版本是否符合要求
* @return boolean
*/
public boolean SupportAndroidVersion() {
int curApiVersion = android.os.Build.VERSION.SDK_INT;
// This work only for android 4.0+
if (curApiVersion >= 14) {
return true;
}
return false;
}
2、创建SensorManager实例
if(SupportAndroidVersion() && context != null) {
SensorManager mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
}
3、在适当的地方注册/取消注册监听事件
//传感器灵敏度分为四级,从上往下灵敏度依次降低 SENSOR_DELAY_FASTEST ->SENSOR_DELAY_GAME ->SENSOR_DELAY_UI ->SENSOR_DELAY_NORMAL
if(SupportAndroidVersion() && mSensorManager != null){
mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);
}
if(SupportAndroidVersion() && mSensorManager != null){
mSensorManager.unregisterListener(this);
}
4、方向旋转监听(当传感器发生变化时会触发onSensorChanged(SensorEvent event))
//rotation: 0(Surface.ROTATION_0---竖屏正向)、1(Surface.ROTATION_90---横屏正向)、2(Surface.ROTATION_180---竖屏反向)、3(Surface.ROTATION_270---横屏反向)
int rotation = ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
在传感器监听触发回调onSensorChanged(SensorEvent event),根据方向值改变准确知道屏幕自动切换成功,由此对屏幕自动切换后做相关操作。