一、 高通代码
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;
}
}
}
}
来源:CSDN
作者:空白的泡
链接:https://blog.csdn.net/kongbaidepao/article/details/104263990