连续对焦(continuousFocus)是指相机启动后,预览界面由模糊到清晰的过程。
1.Set continuousfocus
Camera.java --> onCreate()
String[] defaultFocusModes = getResources().getStringArray(
R.array.pref_camera_focusmode_default_array);
mFocusManager = new FocusManager(mPreferences, defaultFocusModes);
调用了FocusManager的构造函数
FocusManager.java
public FocusManager(ComboPreferences preferences, String[] defaultFocusModes) {
mPreferences = preferences;
mDefaultFocusModes = defaultFocusModes;
mHandler = new MainHandler();
mMatrix = new Matrix();
}
defaultFocusModes的信息被储存在res/values/array.xml
<!-- Default focus mode setting.-->
<string-array name="pref_camera_focusmode_default_array" translatable="false">
<item>continuous-picture</item>
<item>continuous</item>
</string-array>
2. Start continuousfocus
Camera.java -->onCreate()
mCameraPreviewThread.start();
调用了mCameraPreviewThread的run()方法
Thread mCameraPreviewThread = new Thread(new Runnable() {
public void run() {
initializeCapabilities();
startPreview();
}
});
调用了Camera.java --> startPreview()
if (!mSnapshotOnIdle) {
// If the focus mode is continuous autofocus, call cancelAutoFocus to
// resume it because it may have been paused by autoFocus call.
if (Parameters.FOCUS_MODE_CONTINUOUS_PICTURE.equals(mFocusManager.getFocusMode())) {
mCameraDevice.cancelAutoFocus();
}
mFocusManager.setAeAwbLock(false); // Unlock AE and AWB.
}
setCameraParameters(UPDATE_PARAM_ALL);
调用Camera.java --> setCameraParameters(int updateSet)
// We separate the parameters into several subsets, so we can update only
// the subsets actually need updating. The PREFERENCE set needs extra
// locking because the preference can be changed from GLThread as well.
private void setCameraParameters(int updateSet) {
mParameters = mCameraDevice.getParameters();
if ((updateSet & UPDATE_PARAM_INITIALIZE) != 0) {
updateCameraParametersInitialize();
}
if ((updateSet & UPDATE_PARAM_ZOOM) != 0) {
updateCameraParametersZoom();
}
if ((updateSet & UPDATE_PARAM_PREFERENCE) != 0) {
updateCameraParametersPreference();
}
mCameraDevice.setParameters(mParameters);
}
通过mCameraDevice.setParameters(mParameters)就将参数传入frameworks层了, continuousFocus参数通过updateCameraParametersPreference()函数设定到mParameters中。
Camera.java -->updateCameraParametersPreference()
// Set focus mode.
mFocusManager.overrideFocusMode(null);
mParameters.setFocusMode(mFocusManager.getFocusMode());