2015-10-24 14 views
9

ho un'app per fotocamera con camera2 Api, ho implementato onTouchListener su TextureView che utilizzo per l'anteprima dalla fotocamera, quello che voglio è quando un utente tocca lo schermo per potersi concentrare su quello area esattamente come la fotocamera Android integrata. Non so cosa stia funzionando, funziona quando uso AF_MODE_AUTO ma non è preciso, si concentra solo su cosa si trova al centro dello schermo.La fotocamera AF_TRIGGER_START non inizia a mettere a fuoco suTouch

qui è il mio codice:

 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

Potrebbe essere necessario impostare 3A per l'auto: 'mPreviewCaptureRequestBuilder.set ( CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);' –

risposta

0

È è necessario chiamare CaptureSession.capture(mPreviewCaptureRequestBuilder.build(),mCallback,mHandler) dopo aver impostato CONTROL_AF_TRIGGER_CANCEL su CaptureRequest.Builder

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