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) { } });