為了加快上手的速度
先舉簡單的例子和圖片
想像現在情境 : 拍電影
如果要演一齣戲需要的是??
演員?編劇?導演?設備?...等
對,就是設備 !!!
Camera : 攝影機
SurfaceHolder : 幕後處理...等
SurfaceView : 我們的在電視上所看到的畫面
1 . 為了要看到最新內容
所以我們將內容串接在幕後製作
2 . 如果有些效果能直接拍出來
那為啥麼不直接在攝影機做調整?
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <SurfaceView
        android:id="@+id/surfaceView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" />
</RelativeLayout>
import java.io.IOException;
import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class MainActivity extends Activity implements SurfaceHolder.Callback{
    private Camera mCamera;
    private SurfaceView mSurfaceView;
    private SurfaceHolder mSurfaceHolder;
    private boolean isOpen;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSurfaceView = (SurfaceView)findViewById(R.id.surfaceView1);
        mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.addCallback(this);
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }
    @Override
    protected void onResume() {
        super.onResume();
        mCamera = Camera.open();
        if (mCamera != null){
            try {
                mCamera.setPreviewDisplay(mSurfaceHolder);
                mCamera.startPreview();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(mCamera != null){
            mCamera.stopPreview();
            mCamera.release();
            mCamera = null;
        }
    }
    @Override
    public void surfaceCreated(SurfaceHolder holder){
        try
        {
            mCamera = Camera.open();
            mCamera.setPreviewDisplay(mSurfaceHolder);
            mCamera.setDisplayOrientation(90);
        }
        catch (IOException e)
        {
            mCamera.release();
            mCamera = null;
        }
    }
    
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h){
        Camera.Parameters parameters = mCamera.getParameters();
        parameters.setFocusMode("auto");
        mCamera.setParameters(parameters);
        mCamera.startPreview();
        isOpen = true;
    }
    @Override
    public void surfaceDestroyed(SurfaceHolder holder)
    {
        mCamera.stopPreview();
        isOpen = false;
        mCamera.release();
        mCamera = null;
    }
}
參考資料 : [Android] 相機自動定焦拍照(Camera Preview)
歡迎轉載,請註明出處。
沒有留言:
張貼留言