Android 监视sensorLandscape时的屏幕方向改变

在设置界面为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),根据方向值改变准确知道屏幕自动切换成功,由此对屏幕自动切换后做相关操作。

你可能感兴趣的:(Android)