1. 程式人生 > >Camera顯示之app實現簡單camera

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);函式往下分析。