4.1 相关类图以及说明
1、FocusOverlayManager对焦管理,所有方式的拍照都要通过这个类实现对焦。
2、FocusUI 接口,PhotoUI 实现了这个接口。目的:通过FocusOverlayManager 来控制PhotoUI相关的UI。
3、Listener 接口,由PhotoModule 类实现相关的方法。目的:通过FocusOverlayManager 来控制相关的功能。
PhotoModule 创建了FocusOverlayManager 实例。通过这个实例,实现对焦相关的功能。
4、对象 mCameraDevice,属于CameraProxy实例,是由AndroidCameraProxyImpl 类的实例赋值。然后通过这个实例,调用AndroidCameraProxyImpl 类的方法。
5、AndroidCameraProxyImpl ,CameraHandler, AndroidCameraManagerImpl 都是管理 对frameworks 层Camera设备的操作。
4.2 举例分析-----自动对焦时序图
说明:
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的实例。
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方法,实现了对焦。