2015-10-24 10 views
9

私はcamera2を使用しているカメラアプリを持っています。私はカメラからのプレビューに使用するTextureViewにonTouchListenerを実装しました。ユーザーが画面にタップしてフォーカスすることができます。 Android搭載のカメラとまったく同じような領域です。私はそれが間違っているか分からない、それは私がAF_MODE_AUTOを使用するときに動作しますが、正確ではない、それは画面の中央に何をフォーカスします。カメラAF_TRIGGER_STARTはタッチに焦点を当てていません

ここで、それは私のコードです:

 mTextureView.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      switch (event.getAction() & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: 

       Rect rect = cameraCharacteristics 
         .get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE); 
       Size size = cameraCharacteristics 
         .get(CameraCharacteristics.SENSOR_INFO_PIXEL_ARRAY_SIZE); 
       int areaSize = 200; 
       int right = rect.right; 
       int bottom = rect.bottom; 
       int viewWidth = mTextureView.getWidth(); 
       int viewHeight = mTextureView.getHeight(); 
       int ll, 
       rr; 
       Rect newRect; 
       int centerX = (int) event.getX(); 
       int centerY = (int) event.getY(); 
       ll = ((centerX * right) - areaSize)/viewWidth; 
       rr = ((centerY * bottom) - areaSize)/viewHeight; 

       int focusLeft = clamp(ll, 0, right); 
       int focusBottom = clamp(rr, 0, bottom); 

       newRect = new Rect(focusLeft, focusBottom, focusLeft 
         + areaSize, focusBottom + areaSize); 
       MeteringRectangle meteringRectangle = new MeteringRectangle(
         newRect, 500); 
       MeteringRectangle[] meteringRectangleArr = { meteringRectangle }; 


       System.out.println("metering rectARR" + meteringRectangleArr); 

       mPreviewCaptureRequestBuilder.set(
         CaptureRequest.CONTROL_AF_TRIGGER, 
         CameraMetadata.CONTROL_AF_TRIGGER_CANCEL); 

       mPreviewCaptureRequestBuilder.set(
         CaptureRequest.CONTROL_AF_REGIONS, 
         meteringRectangleArr); 

       mPreviewCaptureRequestBuilder.set(
         CaptureRequest.CONTROL_AF_TRIGGER, 
         CameraMetadata.CONTROL_AF_TRIGGER_START); 

       try { 
        mCameraCaptureSession.setRepeatingRequest(
          mPreviewCaptureRequest, 
          mSessionCaptureCallback, 
          mBackgroundHandler); 
       } catch (CameraAccessException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 


       break; 
      } 

      return true; 

     } 
    }); 
} 
+0

: 'mPreviewCaptureRequestBuilder.set( CaptureRequest.CONTROL_MODE、 CameraMetadata.CONTROL_MODE_AUTO);' –

答えて

0

あなたはCaptureRequest.BuilderでCONTROL_AF_TRIGGER_CANCELを設定した後にCaptureSession.capture(mPreviewCaptureRequestBuilder.build(),mCallback,mHandler)に電話する必要があります。

あなたがautoに3Aを設定する必要があるかもしれません
mPreviewCaptureRequestBuilder.set(
        CaptureRequest.CONTROL_AF_TRIGGER, 
        CameraMetadata.CONTROL_AF_TRIGGER_CANCEL); 
//TODO call capture 
//TODO set new focus region 
//TODO call capture/setRepeatingRequest 
関連する問題