美文网首页安卓开发
实时获取当前屏幕方向

实时获取当前屏幕方向

作者: 蓝不蓝编程 | 来源:发表于2018-10-23 17:21 被阅读5次

    背景

    开发中,有时需要获取当前屏幕的方向,所以单独写了个demo,方便大家参考。

    效果:

    image

    Demo源代码:

    https://gitee.com/cxyzy1/screenOrientation.git

    主要代码:

    public class MainActivity extends AppCompatActivity {
        private final String TAG = MainActivity.class.getSimpleName();
        private CameraOrientationListener orientationListener;
        private TextView txt;
        /**
         * 当前屏幕旋转角度
         */
        private int mOrientation = 0;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            txt = findViewById(R.id.textView);
            orientationListener = new CameraOrientationListener(this);
            orientationListener.enable();
    
            startOrientationChangeListener();
        }
    
        /**
         * 启动屏幕朝向改变监听函数 用于在屏幕横竖屏切换时改变保存的图片的方向
         */
        private void startOrientationChangeListener() {
            OrientationEventListener mOrEventListener = new OrientationEventListener(this) {
                @Override
                public void onOrientationChanged(int rotation) {
                    Log.i(TAG, "当前屏幕手持角度方法:" + rotation + "°");
                    if (((rotation >= 0) && (rotation <= 45)) || (rotation > 315)) {
                        rotation = 0;
                    } else if ((rotation > 45) && (rotation <= 135)) {
                        rotation = 90;
                    } else if ((rotation > 135) && (rotation <= 225)) {
                        rotation = 180;
                    } else if ((rotation > 225) && (rotation <= 315)) {
                        rotation = 270;
                    } else {
                        rotation = 0;
                    }
                    if (rotation == mOrientation) {
                        return;
                    }
                    mOrientation = rotation;
                }
            };
            mOrEventListener.enable();
        }
    
        /**
         * 当方向改变时,将调用侦听器onOrientationChanged(int)
         */
        private class CameraOrientationListener extends OrientationEventListener {
    
            private int mCurrentNormalizedOrientation;
    
            public CameraOrientationListener(Context context) {
                super(context, SensorManager.SENSOR_DELAY_NORMAL);
            }
    
            @Override
            public void onOrientationChanged(final int orientation) {
                Log.i(TAG, "当前屏幕手持角度:" + orientation + "°");
                if (orientation != ORIENTATION_UNKNOWN) {
                    mCurrentNormalizedOrientation = normalize(orientation);
                }
    
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        String str = "当前屏幕手持角度:" + orientation + "°\n当前屏幕手持方向:" + mCurrentNormalizedOrientation;
                        txt.setText(str);
                    }
                });
            }
    
            private int normalize(int degrees) {
                if (degrees > 315 || degrees <= 45) {
                    return 0;
                }
                if (degrees > 45 && degrees <= 135) {
                    return 90;
                }
                if (degrees > 135 && degrees <= 225) {
                    return 180;
                }
                if (degrees > 225 && degrees <= 315) {
                    return 270;
                }
                throw new RuntimeException("The physics as we know them are no more. Watch out for anomalies.");
            }
        }
    }
    

    Manifest文件中配置activity时,需要配置:
    android:configChanges="orientation|screenSize"

    安卓开发技术分享: https://www.jianshu.com/p/442339952f26

    相关文章

      网友评论

        本文标题:实时获取当前屏幕方向

        本文链接:https://www.haomeiwen.com/subject/xtbazftx.html