1. 程式人生 > >Android camera 設定聚焦區域

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方法,通過條件判斷,最終呼叫了

Android.hardware.Camera的autoFocus方法,實現了對焦。