宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

前言

  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.containsCamera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)){
                parameters.setFocusModeCamera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
            }else if focusMode.containsCamera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)){
                parameters.setFocusModeCamera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
            }
        }

FLASH_MODE_AUTO设置自动对焦Mode

其他对焦模式并没有上面好说的使用后会一直自动对焦,但是FLASH_MODE_AUTO对焦比较独特,它其实调用一次才触发一次的对焦.

Camera.Parameters parameters = mCamera.getParameters);
parameters.setFocusModeCamera.Parameters.FLASH_MODE_AUTO); //对焦设置为自动
//其他参数配置略...
mCamera.setParametersparameters);//添加参数

很简单在配置Camera1的时候调用setFocusModeCamera.Parameters.FLASH_MODE_AUTO) 实现自动对焦

启用自动对焦

在上面将对焦设置为自动模式后,并不是真的就自动对焦自动对焦的意思其实是当前屏幕中心的画面自动对焦),所以我们需要触发一次对焦.

mCamera.setPreviewTexturesurface);
mCamera.startPreview);
mCamera.autoFocusnew Camera.AutoFocusCallback) {
        @Override
        public void onAutoFocusboolean success, Camera camera) {

        }
    });        

注意!对焦是需要在预览开始之后才能调用的,否则报错.以上设置一次autoFocus 就等于对焦一次.注意!是只对焦一次! 它不是一直在对焦!

FLASH_MODE_AUTO实现主动对焦和被动对焦的思路

被动对焦的思路

被动对焦的思路很简单,用一个Button或者点击预览View进行一次对焦,所以,正常开发的情况下,需要使用一个布尔值来判断当前是不是在预览状态.

主动对焦

也很简单写一个Handler循环就行了,我下面的例子就是每隔2秒对焦一次

private Handler mHandler = new Handler){
        @Override
        public void handleMessageMessage msg) {
            super.handleMessagemsg);
            switch msg.what){
                case 0x01:
                    mCamera.autoFocusnew Camera.AutoFocusCallback) {
                        @Override
                        public void onAutoFocusboolean success, Camera camera) {


                        }
                    });
                    mHandler.sendEmptyMessageDelayed0x01,2*1000);
                    break;
                default:
                    break;
            }
        }
mTextureview.setSurfaceTextureListenernew TextureView.SurfaceTextureListener) {
            @Override
            public void onSurfaceTextureAvailableSurfaceTexture surface, int width, int height) {
                initCamera);
                initCameraConfig);
                try {
                    mCamera.setPreviewTexturesurface);
                    mCamera.startPreview);
                    mHandler.sendEmptyMessage0x01);
                } catch IOException e) {
                    e.printStackTrace);
                }

            }

            @Override
            public void onSurfaceTextureSizeChangedSurfaceTexture surface, int width, int height) {

            }

            @Override
            public boolean onSurfaceTextureDestroyedSurfaceTexture surface) {
                return false;
            }

            @Override
            public void onSurfaceTextureUpdatedSurfaceTexture surface) {

            }
        });