二 通过重力感应实现了横竖屏拍照

535 阅读2分钟

一 通过camerax 实现基本的拍照、屏幕曝光度 闪光灯 放大 聚焦等功能

二 通过重力感应实现了横竖屏拍照

三 camerax 拍照的数据是字节流 如何控制图片的大小与方向

四 感悟与展望

思考: 拍照页面 如何让ui跟随拍照的姿势进行变化呢?

方案一 横屏竖屏 都搞一套ui适配。这种方案的确可行但是可操作性复杂 要是业务数据复杂会出现难以预料的问题。那有没有更简单的方案呢?答案是肯定的,不然我写这个干嘛

方案二 用重力感应 检测到手机拍照的姿势 然后给ui设置属性动画不就ok。一开始我想自己去写 但是对自己写的逻辑担心不适用所有机型,后面还去技术群里面问 也是没有任何反应,后面找啊找 找到了OrientationEventListener 这个类。哇塞 我开心的要命。

源码贴出来

public class MyOrientationDetector extends OrientationEventListener {

    public final static int ORIENTATION_0 = 0;
    public final static int ORIENTATION_90 = 90;
    public final static int ORIENTATION_180 = 180;
    public final static int ORIENTATION_270 = 270;

    public MyOrientationDetector(Context context) {
        super(context);
    }

    @Override
    public void onOrientationChanged(int orientation) {
        if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) {
            return;  //手机平放时,检测不到有效的角度
        }
        //只检测是否有四个角度的改变
        if (orientation > 350 || orientation < 10) { //0度
            orientation = 0;
        } else if (orientation > 80 && orientation < 100) { //90度
            orientation = 90;
        } else if (orientation > 170 && orientation < 190) { //180度
            orientation = 180;
        } else if (orientation > 260 && orientation < 280) { //270度
            orientation = 270;
        } else {
            return;
        }
        if (mOnListenerOrientation != null) {
            mOnListenerOrientation.getOrientation(orientation);
        }
        Log.i("MyOrientationDetector", "onOrientationChanged:" + orientation);
    }

    private OnListenerOrientation mOnListenerOrientation;

    public void setOnListenerOrientation(OnListenerOrientation listenerOrientation) {
        this.mOnListenerOrientation = listenerOrientation;
    }

    public interface OnListenerOrientation {
        void getOrientation(int orientation);
    }
}

总结

我测试了华为 小米 vivo机型 发现。

正向横屏拍照 得到的orientation 是270 如下图

1.png

正向竖屏拍照 得到的orientation 是0 如下图

3.png

反向横屏拍照 得到的orientation 是90 (无图自己脑补)

反向竖屏拍照 得到的orientation 是180 (无图自己脑补)