当前位置:操作系统 > 安卓/Android >>

android多媒体和相机详解七

创建一个预览类
为了让用户有效的获取图像和视频,必须能让他们看到相机中的影像。一个相机预览类是一个SurfaceView类,它可以显示相机中的实时影像,于是用户就可以框住并捕获图像或视频。


下面例子中的代码演示了如何创建一个基本的相机预览类,此类可以被一个viewlayout包含。此类实现了SurfaceHolder.Callback,为的是获取创建和销毁view的回调事件,这个view用来分配相机预览输入。

[java]
/** 一个基本的相机预览类 */ 
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 
    private SurfaceHolder mHolder; 
    private Camera mCamera; 
 
    public CameraPreview(Context context, Camera camera) { 
        super(context); 
        mCamera = camera; 
 
        // 安装一个SurfaceHolder.Callback,于是当下层的界面被创建或销毁时我们可以得到通知  
        mHolder = getHolder(); 
        mHolder.addCallback(this); 
        // 过时的设置,但是android3.0之前的版本需要。  
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 
 
    public void surfaceCreated(SurfaceHolder holder) { 
        // 界面被创建了,现在告诉相机何时画 preview.  
        try { 
            mCamera.setPreviewDisplay(holder); 
            mCamera.startPreview(); 
        } catch (IOException e) { 
            Log.d(TAG, "Error setting camera preview: " + e.getMessage()); 
        } 
    } 
 
    public void surfaceDestroyed(SurfaceHolder holder) { 
        // 空的。在你的activity中注意释放相机预览。  
    } 
 
    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
        //如果你的预览可以改变或旋转,小心这里这些事件们。  
        // 保证在改变大小或改变格式之前停止预览。  
        if (mHolder.getSurface() == null){ 
          // 预览界面不存在  
          return; 
        } 
 
        // 改变之前停止预览  
        try { 
            mCamera.stopPreview(); 
        } catch (Exception e){ 
          // ignore: tried to stop a non-existent preview  
        } 
 
        // 设置预览尺寸并且执行所有大小改变,旋转或格式改变等。  
 
        // 开始使用新的设置预览。  
        try { 
            mCamera.setPreviewDisplay(mHolder); 
            mCamera.startPreview(); 
 
        } catch (Exception e){ 
            Log.d(TAG, "Error starting camera preview: " + e.getMessage()); 
        } 
    } 

/** 一个基本的相机预览类 */
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder mHolder;
    private Camera mCamera;

    public CameraPreview(Context context, Camera camera) {
        super(context);
        mCamera = camera;

        // 安装一个SurfaceHolder.Callback,于是当下层的界面被创建或销毁时我们可以得到通知
        mHolder = getHolder();
        mHolder.addCallback(this);
        // 过时的设置,但是android3.0之前的版本需要。
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        // 界面被创建了,现在告诉相机何时画 preview.
        try {
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        } catch (IOException e) {
            Log.d(TAG, "Error setting camera preview: " + e.getMessage());
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // 空的。在你的activity中注意释放相机预览。
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        //如果你的预览可以改变或旋转,小心这里这些事件们。
        // 保证在改变大小或改变格式之前停止预览。
        if (mHolder.getSurface() == null){
          // 预览界面不存在
          return;
        }

        // 改变之前停止预览
        try {
            mCamera.stopPreview();
        } catch (Exception e){
          // ignore: tried to stop a non-existent preview
        }

        // 设置预览尺寸并且执行所有大小改变,旋转或格式改变等。

        // 开始使用新的设置预览。
        try {
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();

        } catch (Exception e){
        &

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,