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 {
mCamera.setPreviewDisplay(mH

本文介绍了如何在Android应用中自定义相机界面,包括布局设计和使用系统API实时渲染图像。通过重写SurfaceView,结合Camera API进行拍照,并利用Luban库进行图片压缩。虽然提供的示例较为基础,但可以作为实现更复杂相机功能的基础,如曝光控制、闪光灯、对焦等。
4698

被折叠的 条评论
为什么被折叠?



