场景:在播放器界面,用户旋转手机,自动横竖屏切换,当用户处于竖屏点击全屏按钮时,应该转到横屏(使用Activity.setRequestedOrientation会导致屏幕固定为横屏)
方案如下,不使用系统的自动转屏,自动转屏代码完全自己控制,代码如下:
用户点击全屏和竖屏调用 setActivityOrientation
import android.app.Activity; import android.content.pm.ActivityInfo; import android.util.Log; import android.view.OrientationEventListener; /** * Activity方向控制,主要解决点击转屏后不能恢复到自由转屏状态问题。 * */ public class ActivityOrientationControl { private static final String TAG = ActivityOrientationControl.class.getSimpleName(); private Activity mActivity; private OrientationEventListener mOrientationEventListener; private int mUserClickRecordCurrOrientation = -1; public ActivityOrientationControl(Activity activity) { mActivity = activity; mOrientationEventListener = new OrientationEventListener(activity) { @Override public void onOrientationChanged(int orientation) { if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) { // 手机平放时,检测不到有效的角度 return; } // 只检测是否有四个角度的改变 if (orientation > 350 || orientation < 10) { orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; } else if (orientation > 80 && orientation < 100) { orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; } else if (orientation > 170 && orientation < 190) { orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; } else if (orientation > 260 && orientation < 280) { orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; } else { return; } Log.d(TAG, "orientation = " + orientation); if (mUserClickRecordCurrOrientation == orientation) { // 用户停留在点击时所处的方向,不要让重力感应改变方向 return; } else if (mUserClickRecordCurrOrientation != -1) { // 用户离开点击时所处的方向,变为可以自由旋转 mUserClickRecordCurrOrientation = -1; return; } switch (orientation) { case ActivityInfo.SCREEN_ORIENTATION_PORTRAIT: mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); break; case ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE: mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); break; default: break; } } }; } public void enable() { if (mOrientationEventListener.canDetectOrientation()) { mOrientationEventListener.enable(); } } public void disable() { if (mOrientationEventListener.canDetectOrientation()) { mOrientationEventListener.disable(); } } public void setActivityOrientation(int orientation) { mUserClickRecordCurrOrientation = mActivity.getRequestedOrientation(); switch (orientation) { case ActivityInfo.SCREEN_ORIENTATION_PORTRAIT: mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); break; case ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE: mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); break; } } }