Get phone orientation but fix screen orientation to portrait

前端 未结 7 1222
忘了有多久
忘了有多久 2020-12-01 09:09

I want to get the phone orientation but keep the screen orientation to portrait. So no matter the user turns the phone to landscape or portrait, the view stays the same, but

7条回答
  •  無奈伤痛
    2020-12-01 10:02

    Here is a multi-purpose class for easily managing screen orientation changes:

    public class OrientationManager extends OrientationEventListener {
    
        public enum ScreenOrientation {
            REVERSED_LANDSCAPE, LANDSCAPE, PORTRAIT, REVERSED_PORTRAIT
        }
    
        public ScreenOrientation screenOrientation; 
        private OrientationListener listener;
    
        public OrientationManager(Context context, int rate, OrientationListener listener) {
            super(context, rate);
            setListener(listener);
        }
    
        public OrientationManager(Context context, int rate) {
            super(context, rate);
        }
    
        public OrientationManager(Context context) {
            super(context);
        }
    
        @Override
        public void onOrientationChanged(int orientation) {
            if (orientation == -1){
                return;
            }
            ScreenOrientation newOrientation;
            if (orientation >= 60 && orientation <= 140){
                newOrientation = ScreenOrientation.REVERSED_LANDSCAPE;
            } else if (orientation >= 140 && orientation <= 220) {
                newOrientation = ScreenOrientation.REVERSED_PORTRAIT;
            } else if (orientation >= 220 && orientation <= 300) {
                newOrientation = ScreenOrientation.LANDSCAPE;
            } else {
                newOrientation = ScreenOrientation.PORTRAIT;                    
            }
            if(newOrientation != screenOrientation){
                screenOrientation = newOrientation;
                if(listener != null){
                    listener.onOrientationChange(screenOrientation);
                }           
            }
        }
    
        public void setListener(OrientationListener listener){
            this.listener = listener;
        }
    
        public ScreenOrientation getScreenOrientation(){
            return screenOrientation;
        }
    
        public interface OrientationListener {
    
            public void onOrientationChange(ScreenOrientation screenOrientation);
        }
    }
    

    This is way more simple, reusable, and you can also get REVERSE_LANDSCAPE and REVERSE_PORTRAIT orientations.

    You must implement OrientationListener in order to get notified only when an orientation change occurs.

    Don't forget to call orientationManager.enable() to begin orientation tracking, and then calling orientationManager.disable() (this two methods are inherited from OrientationEventListener class)

    UPDATE: use case example

    MyFragment extends Fragment implements OrientationListener {
    
        ...
    
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
    
            orientationManager = new OrientationManager(getActivity(), SensorManager.SENSOR_DELAY_NORMAL, this);
            orientationManager.enable();        
        }
    
        @Override
        public void onOrientationChange(ScreenOrientation screenOrientation) {
            switch(screenOrientation){
                case PORTRAIT:
                case REVERSED_PORTRAIT:
                    MainActivityBase.getInstance().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                break;
                case REVERSED_LANDSCAPE:
                    MainActivityBase.getInstance().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
                break;
                case LANDSCAPE:
                    MainActivityBase.getInstance().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                break;
            }
        }
    }
    

提交回复
热议问题