Camera1的自動對焦仍是有一些坑值得開一個篇幅來說解,通常對焦Mode有如下幾種:ide
有些時候前攝像頭不支持一些對焦模式,因此咱們在切換攝像頭後配置攝像就須要檢查一遍支持的對焦模式spa
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對焦比較獨特,它其實調用一次才觸發一次的對焦.code
Camera.Parameters parameters = mCamera.getParameters(); parameters.setFocusMode(Camera.Parameters.FLASH_MODE_AUTO); //對焦設置爲自動 //其餘參數配置略... mCamera.setParameters(parameters);//添加參數
很簡單在配置Camera1的時候調用setFocusMode(Camera.Parameters.FLASH_MODE_AUTO) 實現自動對焦視頻
在上面將對焦設置爲自動模式後,並非真的就自動對焦(自動對焦的意思實際上是當前屏幕中心的畫面自動對焦),因此咱們須要觸發一次對焦.blog
mCamera.setPreviewTexture(surface); mCamera.startPreview(); mCamera.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { } });
注意!對焦是須要在預覽開始以後才能調用的,不然報錯.以上設置一次autoFocus 就等於對焦一次.注意!是隻對焦一次! 它不是一直在對焦!開發
被動對焦的思路很簡單,用一個Button或者點擊預覽View進行一次對焦,因此,正常開發的狀況下,須要使用一個布爾值來判斷當前是否是在預覽狀態.get
也很簡單寫一個Handler循環就好了,我下面的例子就是每隔2秒對焦一次it
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) { } });