android 程序根據重力感應切換程序的方向

我是標題

今天處理了一下程序的重力感應切換問題,查了好多資料,的確得到了實現方法,但是有點差強人意,實現的效果最終的確可以實現橫豎屏以及反向橫豎屏的切換,但是卻無視了系統通知欄對於方向的鎖定與否…
剛開始我的想法是得到 系統的當前是否鎖定了方向 通過

//返回值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”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章