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方法,实现了对焦。

       

 

  

更多相关文章

  1. Android(安卓)中使用MediaRecorder进行录像详解(视频录制)
  2. android Launcher:AllApps的更新分析
  3. android Fragment 懒加载布局
  4. webview内H5与原生安卓和IOS交互(互调方法/传值)
  5. Android(安卓)活动的最佳实践
  6. android context调用startActivity时报错:Calling startActivity(
  7. Android加载动画库
  8. Appium自动化测试-Android启动实例(2)
  9. Android(安卓)JNI和NDK学习(2)--编程入门

随机推荐

  1. android 判断文件是否存在
  2. Android之MediaPlayer(两种)基本使用方式
  3. C#内置泛型委托之Func委托
  4. C++单例模式的懒汉模式和饿汉模式详解
  5. ASP.NET CORE实现跨域
  6. C++的数据共享与保护你了解吗
  7. PHP json_encode中文乱码解决方法
  8. Vue.js中v-for指令的用法介绍
  9. C++成员函数中const的使用详解
  10. JavaScript属性操作