android 程序根据重力感应切换程序的方向

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013273953/article/details/52703977

我是标题

今天处理了一下程序的重力感应切换问题,查了好多资料,的确得到了实现方法,但是有点差强人意,实现的效果最终的确可以实现横竖屏以及反向横竖屏的切换,但是却无视了系统通知栏对于方向的锁定与否…
刚开始我的想法是得到 系统的当前是否锁定了方向 通过

//返回值0表示关闭了重力感应(锁定方向),1表示开启了重力感应(旋转)
Settings.System.getInt(getContentResolver(),Settings.System.ACCELEROMETER_ROTATION)

得到系统的设定,然后自己决定在onresume() 中决定是否注册重力感应,但是此方法做不到实时的根据用户的设定而注册(解除注册) 下拉通知栏并不会触发 onresume()和onpause()

又想到是否能获取到系统的重力感应的开关呢? 费了九牛二虎之力发现 找不到…

好吧 ,最后绝望的我研究了一下 ActivityInfo中关于屏幕方向的变量,网上也有定义,但是成功离不开实践

SCREEN_ORIENTATION_UNSPECIFIED 根据系统(系统禁用重力感应就会锁定方向,反之方向跟随重力感应)
SCREEN_ORIENTATION_LANDSCAPE  水平
SCREEN_ORIENTATION_PORTRAIT 竖直
SCREEN_ORIENTATION_USER
SCREEN_ORIENTATION_BEHIND
SCREEN_ORIENTATION_SENSOR 根据重力感应的方向
SCREEN_ORIENTATION_NOSENSOR
SCREEN_ORIENTATION_SENSOR_LANDSCAPE
SCREEN_ORIENTATION_SENSOR_PORTRAIT
SCREEN_ORIENTATION_REVERSE_LANDSCAPE  反向的水平
SCREEN_ORIENTATION_REVERSE_PORTRAIT 反向的竖直
SCREEN_ORIENTATION_FULL_SENSOR
SCREEN_ORIENTATION_USER_LANDSCAPE
SCREEN_ORIENTATION_USER_PORTRAIT
SCREEN_ORIENTATION_FULL_USER
SCREEN_ORIENTATION_LOCKED

别的没实践,不敢妄下结论


以下是代码

mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorListener = new SensorEventListener() {

            @Override
            public void onSensorChanged(SensorEvent event) {
                float[] values = event.values;
                int orientation = ORIENTATION_UNKNOWN;
                float X = -values[_DATA_X];
                float Y = -values[_DATA_Y];
                float Z = -values[_DATA_Z];        
                float magnitude = X*X + Y*Y;
                // Don't trust the angle if the magnitude is small compared to the y value
                if (magnitude * 4 >= Z*Z) {
                    float OneEightyOverPi = 57.29577957855f;
                    float angle = (float)Math.atan2(-Y, X) * OneEightyOverPi;
                    orientation = 90 - (int)Math.round(angle);
                    // normalize to 0 - 359 range
                    while (orientation >= 360) {
                        orientation -= 360;
                    } 
                    while (orientation < 0) {
                        orientation += 360;
                    }
                }

                if (orientation>45&&orientation<135) {
//                  getActivity().setRequestedOrientation(8);
                    //根据系统来决定屏幕旋转的方向
                    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
                }else if (orientation>135&&orientation<225){
                    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
//                  getActivity().setRequestedOrientation(9);
                }else if (orientation>225&&orientation<315){
                    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
//                  getActivity().setRequestedOrientation(0);
                }else if ((orientation>315&&orientation<360)||(orientation>0&&orientation<45)){
//                  getActivity().setRequestedOrientation(1);
                    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
                }


            }

            @Override
            public void onAccuracyChanged(Sensor sensor, int accuracy) {
                //nothing
            }
        };
        getDkActivity().addSensorListener(sensor, mSensorListener, SensorManager.SENSOR_DELAY_UI);

记得把对应的activity 的方向设置为
android:configChanges=”orientation|keyboardHidden|screenSize|navigation”

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页