FocusOverlayManager对焦管理

来源:互联网 发布:西剑流 知乎 编辑:程序博客网 时间:2024/06/05 14:25
相关类图以及说明

       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方法,实现了对焦。
原创粉丝点击