Android中自定义照相机Camera详解

转载请注明出处:

http://blog.youkuaiyun.com/xiaohao0724/article/details/68488145

这两天在研究自定义Camera,解决了预览变形、横屏问题下面来记录下成果。
老规矩先上图:

这里写图片描述

要想自定义相机需要用到两个核心类:Camera和SurfaceView

Camera类一些API

Camera用于管理和操作camera资源,它提供了完整的相机底层接口。可以通过camera.getParameters()来获取Camera的参数用以设置照片的预览尺寸、拍摄尺寸、预览帧、拍摄帧、设定光圈、曝光、聚焦、颜色特效等。

SurfaceView类

用于绘制相机预览图像的类,提供给用户实时的预览图像。普通的view以及派生类都是共享同一个surface的,所有的绘制都必须在UI线程中进行。而surfaceview是一种比较特殊的view,它并不与其他普通view共享surface,而是在内部持有了一个独立的surface,surfaceview负责管理这个surface的格式、尺寸以及显示位置。由于UI线程还要同时处理其他交互逻辑,因此对view的更新速度和帧率无法保证,而surfaceview由于持有一个独立的surface,因而可以在独立的线程中进行绘制,因此可以提供更高的帧率。自定义相机的预览图像由于对更新速度和帧率要求比较高,所以比较适合用surfaceview来显示。

SurfaceHolder

surfaceholder是控制surface的一个抽象接口,它能够控制surface的尺寸和格式,修改surface的像素,监视surface的变化等等,surfaceholder的典型应用就是用于surfaceview中。surfaceview通过getHolder()方法获得surfaceholder 实例,通过后者管理监听surface 的状态。

SurfaceHolder.Callback 接口

负责监听surface状态变化的接口,有三个方法:

surfaceCreated(SurfaceHolder holder)

在surface创建后立即被调用。在开发自定义相机时,可以通过重载这个函数调用camera.open()、camera.setPreviewDisplay(),来实现获取相机资源、连接camera和surface等操作。

surfaceChanged(SurfaceHolder holder, int format, int width, int height)

在surface发生format或size变化时调用。在开发自定义相机时,可以通过重载这个函数调用camera.startPreview来开启相机预览,使得camera预览帧数据可以传递给surface,从而实时显示相机预览图像。

surfaceDestroyed(SurfaceHolder holder)

在surface销毁之前被调用。在开发自定义相机时,可以通过重载这个函数调用camera.stopPreview(),camera.release()来实现停止相机预览及释放相机资源等操作。

Code

下面我们就来根据上面来用代码实现自定义相机

public class CustomCameraActivity extends Activity implements OnClickListener,
        SurfaceHolder.Callback, Camera.PictureCallback {

    private Camera camera;
    private static final String TAG = "Havorld";
    private Camera.Parameters parameters;
    private int orientationDegrees = 90;
    private FrameLayout frameLayout;
    private ImageButton imageButton, reset, ok;
    /** 路径: /storage/emulated/0/Pictures/ */
    private String savePat
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值