横屏180°旋转系统不会回调到到onConfigurationChanged()
,只能使用其他的方案,目前有2个方案
1、使用OrientationEventListener
监听屏幕的旋转,里面本质使用的是TYPE_ACCELEROMETER
传感器,具体如下:
mOrientationListener = new OrientationEventListener(this) {
@Override
public void onOrientationChanged(int orientation) {
Log.d(TAG, "onOrientationChanged: " + orientation);
if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) {
return; // 手机平放时,检测不到有效的角度
}
// 只检测是否有四个角度的改变
if (orientation > 350 || orientation < 10) {
// 0度:手机默认竖屏状态(home键在正下方)
Log.d(TAG, "下");
} else if (orientation > 80 && orientation < 100) {
// 90度:手机顺时针旋转90度横屏(home建在左侧)
Log.d(TAG, "左");
} else if (orientation > 170 && orientation < 190) {
// 180度:手机顺时针旋转180度竖屏(home键在上方)
Log.d(TAG, "上");
} else if (orientation > 260 && orientation < 280) {
// 270度:手机顺时针旋转270度横屏,(home键在右侧)
Log.d(TAG, "右");
}
}
};
开启调用mOrientationListener. enable()
, 关闭调用mOrientationListener. disable()
;这种方式对性能消耗比较大, 但是可以获取到手机当前的角度
2、使用监听DisplayManager
方式,手机切换方向会导致UI 显示的改变,所以会回调到这里
DisplayManager.DisplayListener mDisplayListener = new DisplayManager.DisplayListener() {
@Override
public void onDisplayAdded(int displayId) {
android.util.Log.i(TAG, "Display #" + displayId + " added.");
}
@Override
public void onDisplayChanged(int displayId) {
android.util.Log.i(TAG, "Display #" + displayId + " changed.");
}
@Override
public void onDisplayRemoved(int displayId) {
android.util.Log.i(TAG, "Display #" + displayId + " removed.");
}
};
DisplayManager displayManager = (DisplayManager) mContext.getSystemService(Context.DISPLAY_SERVICE);
displayManager.registerDisplayListener(mDisplayListener, UIThreadHandler);
这种方式不会耗性能