Android camera 設定聚焦區域
1、 當我們觸屏的時候,呼叫PreviewGestures 類裡面的dispatchTouch 方法,在這個類裡面。我們有手勢識別GestureDetector.SimpleOnGestureListener介面的實現內部類,它的例項是mGestureListener
private GestureDetector.SimpleOnGestureListener mGestureListener =
new GestureDetector.SimpleOnGestureListener() {
@Override
public void onLongPress (MotionEvent e) {
if (!mZoomOnly && mPie != null && !mPie.showsItems()) {
openPie();
}
}
@Override
public boolean onSingleTapUp (MotionEvent e) {
// Tap to focus when pie is not open
if (mPie == null || !mPie.showsItems()) {
mTapListener.onSingleTapUp(null, (int) e.getX(), (int) e.getY());
return true;
}
return false;
}
@Override
public boolean onScroll (MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
if (e1 == null) {
return false;
}
if (mZoomOnly || mMode == MODE_ZOOM) return false;
int deltaX = (int) (e1.getX() - e2.getX());
int deltaY = (int) (e1.getY() - e2.getY());
if (deltaY > 2 * deltaX && deltaY > -2 * deltaX) {
// Open pie on swipe up
if (mPie != null && !mPie.showsItems()) {
openPie();
return true;
}
}
return false;
}
};
2、 觸屏後,呼叫mGestureListener的onSingleTapUp 方法。在這個方法裡面涉及到的例項
private SingleTapListener mTapListener;
它是將是PhotoUI 的例項,因為PhotoUI 實現了SingleTapListener 介面。
3、 PhotoUI 類的onSingleTapUp 方法如下
public void onSingleTapUp(View view, int x, int y) {
mController.onSingleTapUp(view, x, y);
}
呼叫了mController 例項的onSingleTapUp 方法,而mController 屬於PhotoController。PhotoModule實現了PhotoController介面。而mController 正是PhotoModule的例項。
再此處設定x,y值用以控制點選聚焦的區域。
4、 PhotoModule 類的onSingleTapUp 方法裡呼叫
mFocusManager.onSingleTapUp(x, y);
其中mFocusManager,是FocusOverlayManager 類,呼叫它的onSingleTapUp 方法。進去這個方法後,根據條件,呼叫autoFocus 方法,在這個方法裡,語句 mListener.autoFocus();其中mListener前面提到,由PhotoModule實現,那麼呼叫它的autoFocus 方法。
5、 PhotoModule的autoFocus方法
public void autoFocus() {
mFocusStartTime = System.currentTimeMillis();
mCameraDevice.autoFocus(mHandler, mAutoFocusCallback);
setCameraState(FOCUSING);
}
又呼叫了mCameraDevice的autoFocus方法,而mCameraDevice 前面提到,屬於CameraProxy的例項。
6、 CameraProxy介面的實現類AndroidCameraProxyImpl的autoFocus 方法
public void autoFocus(Handler handler, CameraAFCallback cb) {
mCameraHandler.obtainMessage(
AUTO_FOCUS,
AFCallbackForward.getNewInstance(handler, this, cb)).sendToTarget();
}
7、 mCameraHandler 屬於CameraHandler例項,那麼呼叫它的handleMessage方法,通過條件判斷,最終呼叫了