一 通过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 如下图
正向竖屏拍照 得到的orientation 是0 如下图
反向横屏拍照 得到的orientation 是90 (无图自己脑补)
反向竖屏拍照 得到的orientation 是180 (无图自己脑补)