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


前言

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

            }
        });

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM