2016年1月3日 星期日

Android-拍照_預覽 ( 一 )

利用 Camera + SurfaceView 達到拍照的效果

為了加快上手的速度
先舉簡單的例子和圖片

想像現在情境 : 拍電影

如果要演一齣戲需要的是??
演員?編劇?導演?設備?...等

對,就是設備 !!!
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)

歡迎轉載,請註明出處。

沒有留言:

張貼留言