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方法,通过条件判断,最终调用了
Android.hardware.Camera的autoFocus方法,实现了对焦。