2015-10-24 3 views
9

Ich habe eine Kamera App mit camera2 Api, ich implementiert onTouchListener zu der TextureView ich für die Vorschau von der Kamera verwenden, was ich will ist, wenn ein Benutzer auf den Bildschirm, um sich darauf konzentrieren können Bereich genau wie die eingebaute Android-Kamera. Ich weiß nicht, was es falsch läuft, es funktioniert, wenn ich AF_MODE_AUTO verwende, aber es ist nicht präzise, ​​es konzentriert sich nur darauf, was in der Mitte des Bildschirms ist.Kamera AF_TRIGGER_START startet nicht auf Touch

Hier ist es mein Code:

 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

Sie könnten 3A bis Auto setzen müssen: 'mPreviewCaptureRequestBuilder.set ( CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);' –

Antwort

0

Sie Rufen Sie CaptureSession.capture(mPreviewCaptureRequestBuilder.build(),mCallback,mHandler) auf, nachdem Sie CONTROL_AF_TRIGGER_CANCEL auf dem CaptureRequest.Builder

festgelegt haben
mPreviewCaptureRequestBuilder.set(
        CaptureRequest.CONTROL_AF_TRIGGER, 
        CameraMetadata.CONTROL_AF_TRIGGER_CANCEL); 
//TODO call capture 
//TODO set new focus region 
//TODO call capture/setRepeatingRequest