如何检测从横向到横向180度的屏幕旋转?

我见过类似的其他一些问题,但没有答案。

从纵向(横向)旋转到另一个方向,我们可以调用onConfigurationChanged()。

但是,从横向旋转到横向时(通过180度)onConfigurationChanged()不会被调用。

我已经看到使用OrientationEventListener的提及,但这对我来说似乎是flaky,因为你可以快速旋转而不触发显示方向的改变。

我已经尝试添加一个布局更改侦听器,但没有成功。

所以问题是,如何可靠地检测出这种横向的变化?

Solutions Collecting From Web of "如何检测从横向到横向180度的屏幕旋转?"

也许你应该像这样在你的OrientationEventListener中添加一些逻辑代码:

mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); OrientationEventListener orientationEventListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL) { @Override public void onOrientationChanged(int orientation) { Display display = mWindowManager.getDefaultDisplay(); int rotation = display.getRotation(); if ((rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) && rotation != mLastRotation) { Log.i(TAG, "changed >>> " + rotation); // do something mLastRotation = rotation; } } }; if (orientationEventListener.canDetectOrientation()) { orientationEventListener.enable(); } 

我使用这个代码来为我的情况工作。

  OrientationEventListener mOrientationEventListener = new OrientationEventListener(mActivity) { @Override public void onOrientationChanged(int orientation) { if (orientation == ORIENTATION_UNKNOWN) return; int rotation = mActivity.getWindowManager().getDefaultDisplay().getRotation(); switch (rotation) { case Surface.ROTATION_0: android.util.Log.i(TAG, "changed ROTATION_0 - " + orientation); break; case Surface.ROTATION_90: android.util.Log.i(TAG, "changed ROTATION_90 - " + orientation); break; case Surface.ROTATION_180: android.util.Log.i(TAG, "changed ROTATION_180 - " + orientation); break; case Surface.ROTATION_270: android.util.Log.i(TAG, "changed ROTATION_270 - " + orientation); break; } if ((rotation != mLastRotation) && (rotation & 0x1) == (mLastRotation & 0x1)) { android.util.Log.i(TAG, "unhandled orientation changed >>> " + rotation); } mLastRotation = rotation; } }; if (mOrientationEventListener.canDetectOrientation()){ mOrientationEventListener.enable(); } 

当设备不旋转/移动时,OrientationEventlistener将不起作用。

我发现显示监听器是一个更好的方法来检测变化。

  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);