Camera显示之app实现简单camera

要写一个基本功能的Camera应用其实很简单。


一.布局文件:

main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <SurfaceView
        android:id="@+id/preview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

<RelativeLayout/>


二.主程序:

1.打开Camera:

mCamera = Camera.open(cameraId);//cameraId对应的是前后摄像头。

2.获取显示界面。

        setContentView(R.layout.main);
        surfaceView = (SurfaceView) findViewById(R.id.preview);
        surfaceView.getHolder().addCallback(this);

3.设置相关参数:

    private void setParams() {
        Log.d(TAG, "setParams");
        parameters = mCamera.getParameters();
        parameters.setPreviewSize(960, 540);//根据需要进行改变。
        parameters.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
        parameters.setPictureSize(4096, 2304);//根据需要进行改变
        mCamera.setParameters(parameters);
    }

4.开始预览:

1).预览的时候由于要进行界面显示, 所以要设置一个显示界面, 就要用到我们上面的SurfaceView。

在步骤2中,surfaceView.getHolder().addCallback(this);//主Activity继承了SurfaceHolder.Callback, 设置了Surface的回调的接口SurfaceHolder.Callback, 在Surface创建过程中将会回调以下的方法:

    @Override
    public void surfaceCreated(SurfaceHolder holder) {//创建成功
        Log.d(TAG, "surfaceCreated");
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,//SurfaceView的size改变
            int height) {
        Log.d(TAG, "surfaceChanged:" + width + "," + height);
        mSurfaceHolder = holder;
        startPreview(false);
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {//销毁。
        Log.d(TAG, "surfaceDestroyed");
    }


2). startPreview:

在进行startPreview之间的两个必要条件就是一.Camera已经被打开。 二.Surfaceview创建成功.

所以在surfaceCreated和surfaceChanged中都可以进行startPreview。

 private void startPreview(boolean reuse) {
        if (camera != null && mSurfaceHolder != null) {
            try {
                if (!reuse) {
                    setParams();
                    mCamera.setDisplayOrientation(Util
                            .getCameraDisplayOrientation(this, cameraid));//设置预览显示的方向, 有可能是横屏或竖屏。
                    mCamera.setPreviewDisplay(mSurfaceHolder);
                }
               mCamera.startPreview();
             
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

三。总结:

经过上面及步骤camera的基本预览功能已经实现。 在添加一个拍照的回调接口,就可以进行拍照了。


实现Camera的基本功能很简单, 但是一个完整的Camera功能涉及到很多复杂的参数和配置, 以及UI界面的美观,和一些特效的设置。 要做一个高质量Camera既要界面美观又要速度快,还要拍照质量好这就涉及到很多的问题, 很多问题只在app层是不能够解决。 由于本系列的文章主要是分析camera如何显示画面的, 所以暂不分析其他的东西。


从上面可以看到显示的关键点:mCamera.setPreviewDisplay(mSurfaceHolder);

下一篇就接着mCamera.setPreviewDisplay(mSurfaceHolder);函数往下分析。

你可能感兴趣的:(android,Surface,摄像头)