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