前言
Camera1的自動對焦還是有一些坑值得開一個篇幅來講解,一般對焦Mode有以下幾種:
- Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO 連續自動對焦視頻
- Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE 連續自動對焦圖像
- Camera.Parameters.FOCUS_MODE_AUTO 自動對焦(單次)
檢查支持的對焦Mode
有些時候前攝像頭不支持一些對焦模式,所以我們在切換攝像頭后配置攝像就需要檢查一遍支持的對焦模式
List<String> focusModeList = parameters.getSupportedFocusModes(); for (String focusMode : focusModeList){//檢查支持的對焦 if (focusMode.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)){ parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); }else if (focusMode.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)){ parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); } }
FLASH_MODE_AUTO設置自動對焦Mode
其他對焦模式並沒有上面好說的使用后會一直自動對焦,但是FLASH_MODE_AUTO對焦比較獨特,它其實調用一次才觸發一次的對焦.
Camera.Parameters parameters = mCamera.getParameters(); parameters.setFocusMode(Camera.Parameters.FLASH_MODE_AUTO); //對焦設置為自動 //其他參數配置略... mCamera.setParameters(parameters);//添加參數
很簡單在配置Camera1的時候調用setFocusMode(Camera.Parameters.FLASH_MODE_AUTO) 實現自動對焦
啟用自動對焦
在上面將對焦設置為自動模式后,並不是真的就自動對焦(自動對焦的意思其實是當前屏幕中心的畫面自動對焦),所以我們需要觸發一次對焦.
mCamera.setPreviewTexture(surface); mCamera.startPreview(); mCamera.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { } });
注意!對焦是需要在預覽開始之后才能調用的,否則報錯.以上設置一次autoFocus 就等於對焦一次.注意!是只對焦一次! 它不是一直在對焦!
FLASH_MODE_AUTO實現主動對焦和被動對焦的思路
被動對焦的思路
被動對焦的思路很簡單,用一個Button或者點擊預覽View進行一次對焦,所以,正常開發的情況下,需要使用一個布爾值來判斷當前是不是在預覽狀態.
主動對焦
也很簡單寫一個Handler循環就行了,我下面的例子就是每隔2秒對焦一次
private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case 0x01: mCamera.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { } }); mHandler.sendEmptyMessageDelayed(0x01,2*1000); break; default: break; } }
mTextureview.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { initCamera(); initCameraConfig(); try { mCamera.setPreviewTexture(surface); mCamera.startPreview(); mHandler.sendEmptyMessage(0x01); } catch (IOException e) { e.printStackTrace(); } } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { return false; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surface) { } });