我见过其他一些类似的问题,但没有答案。从纵向旋转到横向(任一方向),然后再旋转回来,我们得到了对onConfigurationChanged()的有用调用。但是,从横向旋转到横向(旋转180度)时,不调用onConfigurationChanged()。我看到过使用OrientationEventListener的介绍,但这对我来说似乎有些古怪,因为您可以快速旋转而不会触发显示方向的更改。我尝试过添加布局更改侦听器,但没有成功。所以问题是,如何可靠地检测横向方向的这种变化?
ryoqjall1#
当设备不旋转/移动时,OrientationEventlistener将不工作。我发现display listener是检测变化的更好方法。
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);
j2qf4p5b2#
您可能应该在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(); }
1hdlvixo3#
我用这个代码让它为我的案子工作。
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(); }
nqwrtyyt4#
您仍然需要使用显示侦听器类:Google推荐使用它来处理从解锁方向开始的180度设备旋转。您不能简单地将对onDisplayChanged的所有回调都视为180度旋转。Google的一个更完整的实现展示了如何在superuser提到的onDisplayChanged回调期间从显示管理器收集显示旋转。
/** DisplayManager to listen to display changes */ private val displayManager: DisplayManager by lazy { applicationContext.getSystemService(DISPLAY_SERVICE) as DisplayManager } /** Keeps track of display rotations */ private var displayRotation = 0 ... override fun onAttachedToWindow() { super.onAttachedToWindow() displayManager.registerDisplayListener(displayListener, mainLooperHandler) } override fun onDetachedFromWindow() { super.onDetachedFromWindow() displayManager.unregisterDisplayListener(displayListener) } private val displayListener = object : DisplayManager.DisplayListener { override fun onDisplayAdded(displayId: Int) {} override fun onDisplayRemoved(displayId: Int) {} override fun onDisplayChanged(displayId: Int) { val difference = displayManager.getDisplay(displayId).rotation - displayRotation displayRotation = displayManager.getDisplay(displayId).rotation if (difference == 2 || difference == -2) { createCaptureSession() } } }
4条答案
按热度按时间ryoqjall1#
当设备不旋转/移动时,OrientationEventlistener将不工作。
我发现display listener是检测变化的更好方法。
j2qf4p5b2#
您可能应该在OrientationEventListener中添加一些逻辑代码,如下所示:
1hdlvixo3#
我用这个代码让它为我的案子工作。
nqwrtyyt4#
您仍然需要使用显示侦听器类:Google推荐使用它来处理从解锁方向开始的180度设备旋转。您不能简单地将对onDisplayChanged的所有回调都视为180度旋转。Google的一个更完整的实现展示了如何在superuser提到的onDisplayChanged回调期间从显示管理器收集显示旋转。