App层autoFocus功能分析

本文详细解析了在按下快门及轻触预览区域两种情况下,相机应用如何触发自动对焦功能,并深入探讨了Camera.java与FocusManager.java中的关键代码执行流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自动对焦在两种场景下实现,分别是按下快门或轻触preview时,下面就简单分析两种情况下的代码执行流程。

1.       按下快门时

Camera.java:

@Override

    public void onShutterButtonFocus(boolean pressed) {

if (mPausing || collapseCameraControls() || mCameraState == SNAPSHOT_IN_PROGRESS) return;

 

        // Do not do focus if there is not enough storage.

        if (pressed && !canTakePicture()) return;

 

        if (pressed) {

            mFocusManager.onShutterDown();

        } else {

            mFocusManager.onShutterUp();

        }

}

 

FocusManager.java

         public void onShutterDown() {

        if (!mInitialized) return;

 

        // Lock AE and AWB so users can half-press shutter and recompose.

        if (mLockAeAwbNeeded && !mAeAwbLock) {

            mAeAwbLock = true;

            mListener.setFocusParameters();

        }

 

        if (needAutoFocusCall()) {

            // Do not focus if touch focus has been triggered.

            if (mState != STATE_SUCCESS && mState != STATE_FAIL) {

                autoFocus();

            }

        }

}


FocusManager.java

private void autoFocus() {

        Log.v(TAG, "Start autofocus.");

        mListener.autoFocus();

        mState = STATE_FOCUSING;

        // Pause the face view because the driver will keep sending face

        // callbacks after the focus completes.

        if (mFaceView != null) mFaceView.pause();

        updateFocusUI();

        mHandler.removeMessages(RESET_TOUCH_FOCUS);

    }


由于Camera.java 实现了FocusManager.Listener接口,所以mListener.autoFocus()的实现在Camera.java中。

Camera.java

@Override

    public void autoFocus() {

        mFocusStartTime = System.currentTimeMillis();

        mCameraDevice.autoFocus(mAutoFocusCallback);

        setCameraState(FOCUSING);

    }


mCameraDevice.autoFocus(mAutoFocusCallback)调用了frameworks/base/core/java/android/hardware/Camera.java,代码执行至框架层了。

public final void autoFocus(AutoFocusCallback cb)

{

         mAutoFocusCallback = cb;

         native_autoFocus();

}

 

 

2.轻触preview

 Camera.java

   

    // Preview area is touched. Handle touch focus.

    @Override

    public boolean onTouch(View v, MotionEvent e) {

        if (mPausing || mCameraDevice == null || !mFirstTimeInitialized

                || mCameraState == SNAPSHOT_IN_PROGRESS) {

            return false;

        }

 

        // Do not trigger touch focus if popup window is opened.

        if (collapseCameraControls()) return false;

 

        // Check if metering area or focus area is supported.

        if (!mFocusAreaSupported && !mMeteringAreaSupported) return false;

 

        return mFocusManager.onTouch(e);

}


FocusManager.java

public boolean onTouch(MotionEvent e)中调用了autoFocus()

 

       

 	// Set the focus area and metering area.

        mListener.setFocusParameters();

        if (mFocusAreaSupported && (e.getAction() == MotionEvent.ACTION_UP)) {

            autoFocus();

        } else {  // Just show the indicator in all other cases.

            updateFocusUI();

            // Reset the metering area in 3 seconds.

            mHandler.removeMessages(RESET_TOUCH_FOCUS);

            mHandler.sendEmptyMessageDelayed(RESET_TOUCH_FOCUS, RESET_TOUCH_FOCUS_DELAY);

        }

下面的代码流程与shutter中后半部分相似,在此不再赘述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值