touch af_ae && long press af_ae lock

喜欢而已 提交于 2020-02-11 21:21:39

 

一、  高通代码

  1.1  点击操作入口

@Override
public void onSingleTapUp(View view, int x, int y) {
if (mPaused || !mCamerasOpened || !mFirstTimeInitialized || !mAutoFocusRegionSupported
|| !mAutoExposureRegionSupported || !isTouchToFocusAllowed()
            || mCaptureSession[getMainCameraId()] == null) {
return;
}
Log.d(TAG, "onSingleTapUp " + x + " " + y);
    int[] newXY = {x, y};
    if (mUI.isOverControlRegion(newXY)) return;
    if (!mUI.isOverSurfaceView(newXY)) return;

    if (mT2TFocusRenderer != null && mT2TFocusRenderer.isShown()) {
mT2TFocusRenderer.onSingleTapUp(x, y);
triggerTouchFocus(x, y, TouchTrackFocusRenderer.TRACKER_CMD_REG);
        return;
}

mUI.setFocusPosition(x, y);
x = newXY[0];
y = newXY[1];
mInTAF = true;
mUI.onFocusStarted();
triggerFocusAtPoint(x, y, mCurrentSceneMode.getCurrentId());
}

   1.2    start tigger

public void triggerFocusAtPoint(float x, float y, int id) {
   if (DEBUG) {
        Log.d(TAG, "triggerFocusAtPoint " + x + " " + y + " " + id);
   }
   if (mCropRegion[id] == null) {
        Log.d(TAG, "crop region is null at " + id);
        mInTAF = false;
        return;
    }
    Point p = mUI.getSurfaceViewSize();
    int width = p.x;
    int height = p.y;
    if (width * mCropRegion[id].width() != height * mCropRegion[id].height()) {
        Point displayPoint = mUI.getDisplaySize();
        if (width >= displayPoint.x) {
            height = width * mCropRegion[id].width() / mCropRegion[id].height();
   }
   if (height >= displayPoint.y) {
            width = height * mCropRegion[id].height() / mCropRegion[id].width();
   }
}
x += (width - p.x) / 2;
y += (height - p.y) / 2;
mAFRegions[id] = afaeRectangle(x, y, width, height, 1f, mCropRegion[id], id);
mAERegions[id] = afaeRectangle(x, y, width, height, 1.5f, mCropRegion[id], id);
mCameraHandler.removeMessages(CANCEL_TOUCH_FOCUS, mCameraId[id]);
autoFocusTrigger(id);
}


// start trigger ------------------------------------
private void autoFocusTrigger(int id) {
if (DEBUG) {
            Log.d(TAG, "autoFocusTrigger " + id);
}
if (null == mActivity || null == mCameraDevice[id]
                || !checkSessionAndBuilder(mCaptureSession[id], mPreviewRequestBuilder[id])) {
            warningToast("Camera is not ready yet to take a picture.");
mInTAF = false;
            return;
}
try {
//create builder
CaptureRequest.Builder builder = getRequestBuilder(id);
builder.setTag(id);
addPreviewSurface(builder, null, id);

// af mode = CONTROL_AF_MODE_AUTO;
mControlAFMode = CaptureRequest.CONTROL_AF_MODE_AUTO;
mIsAutoFocusStarted = true;
mIsCanceled = false;


applySettingsForAutoFocus(builder, id);
//            private void applySettingsForAutoFocus(CaptureRequest.Builder builder, int id) {
//                // notice: 1
//                builder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest
//                        .CONTROL_AF_TRIGGER_START);
//                if (mCurrentSceneMode.mode == CameraMode.VIDEO ||
//                        mCurrentSceneMode.mode == CameraMode.HFR) {
//                    Range fpsRange = mHighSpeedCapture ? mHighSpeedFPSRange : new Range(30, 30);
//                    builder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fpsRange);
//                }
//                applyAFRegions(builder, id);
//                applyAERegions(builder, id);
//                applyCommonSettings(builder, id);
//            }

            // notice: 2
builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);
mState[id] = STATE_WAITING_TOUCH_FOCUS;
applyFlash(builder, id);//apply flash mode and AEmode for this temp builder

            // start af
if (mCurrentSceneMode.mode == CameraMode.HFR && isHighSpeedRateCapture()) {
                List<CaptureRequest> tafBuilderList = isSSMEnabled() ?
                        createSSMBatchRequest(builder) :
                        ((CameraConstrainedHighSpeedCaptureSession) mCaptureSession[id]).
                        createHighSpeedRequestList(builder.build());
mCaptureSession[id].captureBurst(tafBuilderList, mCaptureCallback, mCameraHandler);
} else {
                //af param down
mCaptureSession[id].capture(builder.build(), mCaptureCallback, mCameraHandler);
}

//---------------------------------------------------------------
setAFModeToPreview(id, mControlAFMode);
//---------------------------------------------------

//            public void setAFModeToPreview(int id, int afMode) {
//                if (!checkSessionAndBuilder(mCaptureSession[id], mPreviewRequestBuilder[id])) {
//                    return;
//                }
//                //af mode = CaptureRequest.CONTROL_AF_MODE_AUTO;
//                mPreviewRequestBuilder[id].set(CaptureRequest.CONTROL_AF_MODE, afMode);
//                applyAFRegions(mPreviewRequestBuilder[id], id);
//                applyAERegions(mPreviewRequestBuilder[id], id);
//                mPreviewRequestBuilder[id].setTag(id);
//
//                //set to preview
//                try {
//                    if (isSSMEnabled() && (mIsPreviewingVideo || mIsRecordingVideo)) {
//                        mCaptureSession[id].setRepeatingBurst(createSSMBatchRequest(mVideoRecordRequestBuilder),
//                                mCaptureCallback, mCameraHandler);
//                    } else if (mCaptureSession[id] instanceof CameraConstrainedHighSpeedCaptureSession) {
//                        CameraConstrainedHighSpeedCaptureSession session =
//                                (CameraConstrainedHighSpeedCaptureSession) mCaptureSession[id];
//                        List requestList = CameraUtil.createHighSpeedRequestList(mVideoRecordRequestBuilder.build());
//                        session.setRepeatingBurst(requestList, mCaptureCallback, mCameraHandler);
//                    } else {
//                        mCaptureSession[id].setRepeatingRequest(mPreviewRequestBuilder[id]
//                                .build(), mCaptureCallback, mCameraHandler);
//                    }
//                } catch (CameraAccessException | IllegalStateException e) {
//                }
//            }

Message message =
mCameraHandler.obtainMessage(CANCEL_TOUCH_FOCUS, id, 0, mCameraId[id]);
// 3s 后cancel
mCameraHandler.sendMessageDelayed(message, CANCEL_TOUCH_FOCUS_DELAY);

//          case CANCEL_TOUCH_FOCUS:
//                Log.d(TAG,"-------------cancel touch---------------------");
//                cancelTouchFocus(id);


} catch (CameraAccessException | IllegalStateException | IllegalArgumentException e) {
            e.printStackTrace();
}
    }

 

1.3    cancel  focus tirgger

private void cancelTouchFocus() {
if (getCameraMode() == DUAL_MODE) {
   if(mState[BAYER_ID] == STATE_WAITING_TOUCH_FOCUS) {
            cancelTouchFocus(BAYER_ID);
   } else if (mState[MONO_ID] == STATE_WAITING_TOUCH_FOCUS) {
            cancelTouchFocus(MONO_ID);
   }

} else {
  if (mState[getMainCameraId()] == STATE_WAITING_TOUCH_FOCUS ||
  mState[getMainCameraId()] == STATE_PREVIEW) {
  cancelTouchFocus(getMainCameraId());
   }
}
}

 

 二、 long press

  2.1  长按   CaptureModule.java

public void onLongPress(int x, int y) {
    Log.d(TAG, "onLongPress " + x + "," + y);
    if (mUI.isPreviewLayoutShow()) {
return;
}

//1.if locked, cancel locked ---------------
if (isAfAeLocked) {
     LockAEAF(false);
}

//2. if focused, clear focus
if(mLastResultAFState==CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED
||mLastResultAFState==CaptureResult.CONTROL_AF_STATE_PASSIVE_UNFOCUSED
||mLastResultAFState==CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED
||mLastResultAFState==CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED){
if (mUI.isBeautyLayoutShow() == View.GONE && isshowQRcode) {
mUI.setAeSeekbarLayoutVisibility(true);
}
//set ae_af lockView --------------------
mUI.setAFAELockViewLockPosition(x, y);
mUI.clearFocus();
mIsAfAeLockedByLongPress = true;
}
//3. same as singTap --------------
    onSingleTapUp(null, x, y);
}


@Override
public void onSingleTapUp(View view, int x, int y) {
    Log.i(TAG,"onSingleTapUp() x= "+x+" y="+y);
     if (mUI.isPreviewLayoutShow())  return;
requestFocus(x, y);

}


public void requestFocus(int x, int y) {

if (mPaused || !mCamerasOpened || !mFirstTimeInitialized || !mAutoFocusRegionSupported
|| !mAutoExposureRegionSupported || !isTouchToFocusAllowed()) {
        Log.d(TAG, "requestFocus() return!");
        return;
}

//4. if locked, cancel lock ----------------
if (isAfAeLocked) {
   LockAEAF(false);
}

//change ui
mUI.setAFAELockViewVisible(View.INVISIBLE, 0, 0);
mUI.setFocusPosition(x, y);
mUI.setFocusOnTap(true);
mUI.onFocusStarted();

//5. start trigger
triggerFocusAtPoint(x, y, getMainCameraId());
}


public void triggerFocusAtPoint(float x, float y, int id) {
    ............
    Point p = getSurfaceViewSize();
    int width = p.x;
    int height = p.y;
mAFRegions[id] = afaeRectangle(x, y, width, height, 1f, mCropRegion[id]);
mAERegions[id] = afaeRectangle(x, y, width, height, 1.5f, mCropRegion[id]);
    if (mCameraHandler != null) {
mCameraHandler.removeMessages(CANCEL_TOUCH_FOCUS, mCameraId[id]);
    }
    autoFocusTrigger(id);
}

  2.2 下参后在回调用处理  CaptureModule.java

private CameraCaptureSession.CaptureCallback mCaptureCallback
= new CameraCaptureSession.CaptureCallback() {

  .............

  @Override
  public void onCaptureCompleted(CameraCaptureSession session,
    CaptureRequest request, TotalCaptureResult result) {

    int id = (int) result.getRequest().getTag();
    if (id == getMainCameraId()) {
    // ----  update focus state  -----------------
    updateFocusStateChange(result);
    ........
  }
}


// update focus State
private void updateFocusStateChange(CaptureResult result) {

  final Integer resultAFState = result.get(CaptureResult.CONTROL_AF_STATE);
    if (resultAFState == null) return;

  // Report state change when AF state has changed.
  if (resultAFState != mLastResultAFState && mFocusStateListener != null) {
  mActivity.runOnUiThread(new Runnable() {
  
     @Override
     public void run() {
       if (resultAFState == CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN){
       //reset continuous focus position to center of preview
        mUI.setFocusPosition(-1, -1);
     }

     //---- update  ui  focus ---
     mFocusStateListener.onFocusStatusUpdate(resultAFState);
    }
  });
 }
mLastResultAFState = resultAFState;
}

2.3 更新界面的focuse UI   

   FocusStateListener.java  -> CaptureUI.java ->  PieRenderer.java

public class FocusStateListener {
private static final String TAG = "SnapCam_FocusStateListe";
    private FocusUI mUI;

    public FocusStateListener(FocusUI ui) {
mUI = ui;
}

public void onFocusStatusUpdate(int focusState) {
switch (focusState) {
case CaptureResult.CONTROL_AF_STATE_ACTIVE_SCAN:
                Log.d(TAG, "CONTROL_AF_STATE_ACTIVE_SCAN onFocusStarted");
// mUI.onFocusStarted();
break;
            case CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED:
                Log.d(TAG, "CONTROL_AF_STATE_FOCUSED_LOCKED onFocusSucceeded");
mUI.onFocusSucceeded(true);
                break;
            case CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
                Log.d(TAG, "CONTROL_AF_STATE_NOT_FOCUSED_LOCKED onFocusFailed");
mUI.onFocusFailed(false);
                break;
            case CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED:
                Log.d(TAG, "CONTROL_AF_STATE_PASSIVE_FOCUSED onFocusSucceeded");
mUI.onFocusSucceeded(true);
                break;
            case CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN:
                Log.d(TAG, "CONTROL_AF_STATE_PASSIVE_SCAN onFocusStarted");
// mUI.onFocusStarted();
break;
            case CaptureResult.CONTROL_AF_STATE_PASSIVE_UNFOCUSED:
                Log.d(TAG, "CONTROL_AF_STATE_PASSIVE_UNFOCUSED onFocusFailed");
mUI.onFocusFailed(true);
                break;
            case CaptureResult.CONTROL_AF_STATE_INACTIVE:
                Log.d(TAG, "CONTROL_AF_STATE_INACTIVE clearFocus");
mUI.clearFocus();
                break;
}
    }
}

CaptureUI.java

@Override
public void onFocusSucceeded(boolean timeout) {
    FocusIndicator indicator = getFocusIndicator();
    if (mModule.isAfAeLongPress()) {
if (indicator != null) indicator.clear();

        //if long press, show afae lock_view
setAFAELockViewVisible(View.VISIBLE);
mModule.LockAEAF(true);
} else {
        // if short, show af view
if (indicator != null) indicator.showSuccess(timeout);
}
}

PieRenderer.java

public class PieRenderer extends OverlayRenderer
implements FocusIndicator {

.....

@Override
public void showSuccess(final boolean timeout) {
    Log.i(TAG,"showSuccess() timeout="+timeout);
    if (mIsBokehMode) {
      mOverlay.postDelayed(new Runnable() {
       @Override
       public void run() {
          if (mState == STATE_FOCUSING) {
              startAnimation(SCALING_DOWN_TIME, timeout, mStartAnimationAngle);
              mState = STATE_FINISHING;
              mFocused = true;
               }
            }
        },3000);
} else {
          if (mState == STATE_FOCUSING) {
            if(isSamsungUI){
               mSamAnimTimeOut = timeout;
               disappear();
               update();
            }else{
                startAnimation(SCALING_DOWN_TIME,timeout, mStartAnimationAngle);
            }
         mState = STATE_FINISHING;
         mFocused = true;
    }
    }
  }

}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!