Android 開發 Camera1_如何使用對焦功能

前言

  Camera1的自動對焦仍是有一些坑值得開一個篇幅來說解,通常對焦Mode有如下幾種:ide

  •   Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO 連續自動對焦視頻
  •   Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE  連續自動對焦圖像
  •   Camera.Parameters.FOCUS_MODE_AUTO 自動對焦(單次)

檢查支持的對焦Mode

有些時候前攝像頭不支持一些對焦模式,因此咱們在切換攝像頭後配置攝像就須要檢查一遍支持的對焦模式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設置自動對焦Mode

其餘對焦模式並無上面好說的使用後會一直自動對焦,可是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 就等於對焦一次.注意!是隻對焦一次! 它不是一直在對焦!開發

FLASH_MODE_AUTO實現主動對焦和被動對焦的思路

被動對焦的思路

被動對焦的思路很簡單,用一個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) {

            }
        });
相關文章
相關標籤/搜索