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