1、目的
:开发时产品需求自己定义拍照界面,拍照处理。如下图:自定义一个拍照界面
可以看到,底部拍照按钮,和相册选择。整个界面和系统相机不一样。这时我们就要自己去开发定义自己的相机处理。
2、实现思路
写好自己需求的相机界面布局。拍照界面就相当于一个activity界面。然后调用系统API去实时获取硬件捕获到的图像用系统控件SurfaceView实时渲染出来。点击拍照,系统API提供返回原图,此时需要压缩处理,本文引入git上Luban图片压缩处理。多说一句,可异步、同步压缩,包括尺寸和存储大小的压缩。主要API:Camera。当然更建议用Camera2.本文不作描述。
3、代码实现
3.1、先重写SurfaceView,相当于一个动态显示框用作把硬件捕捉的图像实时显示,咱们相机界面的预览控件。可在自己相机界面直接引用该控件。或者动态加入布局中。
/** * Author txwang * * @version V1.0 * Created by txwang on 2019/5/5. * Instruction : * @date: 2019-05-05 11:04 **/ public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder mHolder; private Camera mCamera; public CameraPreview(Context context, Camera camera) { super(context); //初始化Camera对象 mCamera = camera; //得到SurfaceHolder对象 mHolder = getHolder(); //添加回调,得到Surface的三个声明周期方法 mHolder.addCallback(this); // deprecated setting, but required on Android versions prior to 3.0 mHolder.setType(SurfaceHolder.SURFACE_TYPE_HARDWARE); } @Override public void surfaceCreated(SurfaceHolder holder) { try { //设置预览方向z'z'z mCamera.setDisplayOrientation(90); //把这个预览效果展示在SurfaceView上面 mCamera.setPreviewDisplay(holder); //开启预览效果 mCamera.startPreview(); } catch (IOException e) { // Log.d(TAG, "Error setting camera preview: " + e.getMessage()); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if (holder.getSurface() == null) { return; } //停止预览效果 mCamera.stopPreview(); //重新设置预览效果 try {