在Camera中,autofocus是个很重要的知识点,一般有移动对焦,点击聚焦和长按聚焦,这里我们以展锐平台相机的点击聚焦为例,分析下聚焦在app层的流程。
1、聚焦触发
点击屏幕事件的触发
PhotoModule.java的onSingleTapUp中
public void onSingleTapUp(View view, int x, int y) {
......
//调用FocusManager的singletap
mFocusManager.onSingleTapUp(x, y);
}
FocusOverlayManager.java的onSingleTapUp中
public void onSingleTapUp(int x, int y) {
lastSingleTap.set(x,y);
//如果当前已经是定焦的,取消定焦,重新对焦
if(isAFLock) {
sendCancleMsg(false);
mListener.setAELock(false);
isAFLock = false;
}
//没有初始化或者拍照前的聚焦的状态,直接返回
if (!mInitialized || mState == STATE_FOCUSING_SNAP_ON_FINISH) {
return;
}
//让用户可以取消掉之前未消失的触摸聚焦
if ((mFocusArea != null) && (mState == STATE_FOCUSING ||
mState == STATE_SUCCESS || mState == STATE_FAIL)) {
cancelAutoFocus();
}
if (mPreviewRect.width() == 0 || mPreviewRect.height() == 0) {
return;
}
// Initialize variables.
if (mAutoChasingSupported && mAutoChasingEnable){
boolean isChasing = isAutoChasing();
if (isChasing) {
initializeAutoChasingRegion(0,0);
Log.d(TAG,"set chasing Region x = 0 , y = 0");
mListener.setAutoChasingParameters();
}
}
//初始化聚焦的区域
// Initialize mFocusArea.
if (mFocusAreaSupported) {
initializeFocusAreas(x, y);
mFocusRing.setFocusLocation(x, y);
}
// Initialize mMeteringArea.
if (mMeteringAreaSupported) {
initializeMeteringAreas(x, y);
}
// Log manual tap to focus.
mTouchCoordinate = new TouchCoordinate