第一次技术分享,给同事们讲还是比较紧张。。讲的时候发在内网里面的markdown记录一下。。Camera开发确实学到了不少东西
一、Surface SurfaceView
- 什么是Surface,SurfaceView?
- 普通View都是共享一个Surface的,所有的绘制也都在UI线程中进行,因为UI线程还要处理其他逻辑,因此对View的更新速度和绘制帧率无法保证。这显然不适合相机实时预览这种情况,因而SurfaceView持有一个单独的Surface,它负责管理这个Surface的格式、尺寸以及显示位置,它的Surface绘制也在单独的线程中进行,因而拥有更高的绘制效率和帧率。
SurfaceView显示Surface
SurfaceView通过SuraceHolder添加回调监听Surface的状态(create,change,destroy)
二、Camera
- 1.打开相机:
mCamera.open()
- 2.设置预览的surface
mCamera.setPreviewDisplay(mSurfaceHolder)
- 3.开始预览
mCamera.startPreview()
- 4.拍照
mCamera.takePicture({}, null, { data, camera ->
...
}
- 5.停止预览
mCamera.stopPreview()
- 6.释放摄像头
mCamera.release()
三、遇到的和需要注意的问题
1.orientation——mCamera.setDisplayOrientation(displayOrientation)
抄写了官方文档的demo,发现竖屏下,空间发生了扭曲和旋转...
orientation相机图像顺时针旋转到设备自然方向一致时的图像,它可能是 0、90、180、270 四种。
public static void setCameraDisplayOrientation(Activity activity,
int cameraId, android.hardware.Camera camera) {
android.hardware.Camera.CameraInfo info =
new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(cameraId, info);
int rotation = activity.getWindowManager().getDefaultDisplay()
.getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0: degrees = 0; break;
case Surface.ROTATION_90: degrees = 90; break;
case Surface.ROTATION_180: degrees = 180; break;
case Surface.ROTATION_270: degrees = 270; break;
}
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360; // compensate the mirror
} else { // back-facing
result = (info.orientation - degrees + 360) % 360;
}
camera.setDisplayOrientation(result);
}
2.预览的图像比例 保存图像的比例
SurfaceView尺寸 Previewsize尺寸 Picturesize尺寸
- 不能定义任意的预览尺寸,不同机器硬件有不同的支持,设置的尺寸应该尽量和SurfaceView的尺寸宽高比保持一致或者相近,如果宽高比相差太大,会造成图像拉伸的现象
- 保存的图像和相机预览的图像不是一张图片,也需要设置orientation和size
四、其它值得注意的问题(主要是需求相关的重力感应)
竖屏或者横屏应用orientation
用OrientationEventListener监听角度,用途还蛮多的1...2...3...blablabla...
五、为啥不用Camera2?
(1.兼容性问题,事实上并不是API 21....
2.没时间学了。。)
天天P图https://mp.weixin.qq.com/s/g2svnNpS6hxX0cl44Qkw3g
六、CameraView怎么处理的上面那些问题?
- 计算displayOrentation
- CameraView的onMeasure方法根据ratio调整framelayout的宽高
主要抄写了和学习了:
1.android developer camera : https://developer.android.com/reference/android/hardware/Camera.html
2.CameraView:https://github.com/google/cameraview
3.简书:https://www.jianshu.com/p/f8d0d1467584
4.郭霖的公众号文章:https://mp.weixin.qq.com/s/wskgxB-YJT-z5FhslXr1oQ
5.CameraView源码分析:CameraView源码分析
以及其他值得抄写的代码和文章。。。