Setting模块之无障碍(辅助功能)
首先这个辅助功能在AccessibilitySettings类中通过oncreate()方法去加载布局
布局Serverce(SERVICES_CATEGORY)
布局System(SYSTEM_CATEGORY):
字幕(CAPTIONING_PREFERENCE_SCREEN),
放大手势(DISPLAY_MAGNIFICATION_PREFERENCE_SCREEN),
大号字体(TOGGLE_LARGE_TEXT_PREFERENCE),
高对比度文字(TOGGLE_HIGH_TEXT_CONTRAST_PREFERENCE),
按电源按钮结束通话(TOGGLE_POWER_BUTTON_ENDS_CALL_PREFERENCE),
自动旋转屏幕(TOGGLE_LOCK_SCREEN_ROTATION_PREFERENCE),
说出密码(TOGGLE_SPEAK_PASSWORD_PREFERENCE),
无障碍快捷方式(ENABLE_ACCESSIBILITY_GESTURE_PREFERENCE_SCREEN),
触摸和按住延迟(SELECT_LONG_PRESS_TIMEOUT_PREFERENCE),
颜色反转(TOGGLE_INVERSION_PREFERENCE),
色彩校正(DISPLAY_DALTONIZER_PREFERENCE_SCREEN)。
(未找到 文字转语音(TTS)输出)
然后执行initializeAllPreferences();初始化控件,
onresume()方法:更新控件updateAllPreferences();注册服务loadInstalledServices();
updateAllPreferences();这个方法分为两个部分:
updateServicesPreferences(); //服务是自动生成的,这个方法会去根据服务类去创建preference然后添加进去
updateSystemPreferences(); //即更新System
监听事件:
onPreferenceChange()监听触摸按住延迟,颜色反转
onPreferenceTreeClick()监听大号字体 高对比度文字 按电源建结束通话 自动旋转屏幕说出密码 无障碍快捷方式 放大手势
未找到(字幕,色彩校正)
字幕com.android.settings.accessibility.CaptionPropertiesFragment"
色彩校正com.android.settings.accessibility.ToggleDaltonizerPreferenceFragment
关于控件Preferences的理解:
1:自动保存2.自动跳转3.两个监听器onPreferenceChange()onPreferenceTreeClick()
在onCreateView()方法中去解析
publicView onCreateView(
LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) {
finalView rootView = inflater.inflate(R.layout.captioning_preview,container, false);
介绍一下这个布局R.layout.captioning_preview,这个布局就是这个界面的那张图
实际是两个控件SubtitleView和ImagView
介绍一下onViewCreated()方法,在onCreateView方法后回调,并在这之前把状态保存到View
在这个onViewCreated()方法中
finalbooleanenabled = mCaptioningManager.isEnabled();
mPreviewText= (SubtitleView) view.findViewById(R.id.preview_text);//字幕外观示例
//根据系统服务得到CaptioningManager对象,他的isEnabled()判断来用户首选的状态
mPreviewText.setVisibility(enabled? View.VISIBLE: View.INVISIBLE);
mPreviewWindow= view.findViewById(R.id.preview_window);
mPreviewViewport= view.findViewById(R.id.preview_viewport);
mPreviewViewport.addOnLayoutChangeListener(newOnLayoutChangeListener() {//监听布局改变
@Override
publicvoidonLayoutChange(View v, intleft, inttop, intright, intbottom,
intoldLeft, intoldTop, intoldRight, intoldBottom) {
refreshPreviewText();//刷新
}
});
}
字幕:(captioning_preference_screen)
自动跳转的进入的是CaptionPropertiesFragment
在oncreate
addPreferencesFromResource(R.xml.captioning_settings);//加入布局
initializeAllPreferences();//初始化控件
updateAllPreferences();//更新控件
refreshShowingCustom();//判断是否显示custom
installUpdateListeners();//设置监听器
介绍一下这个布局R.xml.captioning_settings,整个是一个PreferenceScreen,里面分为两个部分,都是PreferenceCategory,一个是标准选项,一个是自定义选项"
标准选项(standard):
语言(captioning_locale),文字大小(captioning_font_size),字幕样式(captioning_preset)
自定义选项(custom):
字体系列(captioning_typeface),文字颜色(captioning_foreground_color),
文字不透明度(captioning_foreground_opacity),边缘类型(captioning_edge_type),
边缘颜色(captioning_edge_color),背景颜色(captioning_background_color),
背景不透明度(captioning_background_opacity),字幕窗口颜色(captioning_window_color),
字幕窗口不透明度(captioning_window_opacity)
界面上的开启功能的控件在
onActivityCreated(BundlesavedInstanceState) {
SettingsActivity activity =(SettingsActivity) getActivity();
mSwitchBar= activity.getSwitchBar();
mSwitchBar.setCheckedInternal(enabled);
mToggleSwitch= mSwitchBar.getSwitch();//得到开启控件
installSwitchBarToggleSwitch();//设置开启控件监听
开启控件监听:mToggleSwitch.setOnBeforeCheckedChangeListener(newOnBeforeCheckedChangeListener() {
@Override
publicbooleanonBeforeCheckedChanged(ToggleSwitch toggleSwitch, booleanchecked) {
mSwitchBar.setCheckedInternal(checked);
Settings.Secure.putInt(getActivity().getContentResolver(),
Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED,checked ? 1 : 0);
getPreferenceScreen().setEnabled(checked);//让整个界面不可用或者可用
if(mPreviewText!= null){
mPreviewText.setVisibility(checked? View.VISIBLE: View.INVISIBLE);//”字幕外观示例“是否可用
}
returnfalse;
}
});
监听事件:(都是按代码顺序)
字体系列,文字大小,语言,:onPreferenceChange(Preferencepreference, Object value)
<pre name="code" class="html">Settings.Secure.putString(cr,Settings.Secure.ACCESSIBILITY_CAPTIONING_LOCALE,(String)
putString()方法是Storea name/value pair into the database.
最后都执行refreshPreviewText();
方法如下
finalSubtitleView preview = mPreviewText;
if(preview != null){
finalintstyleId = mCaptioningManager.getRawUserStyle();//得到用户首选的id
applyCaptionProperties(mCaptioningManager,preview, mPreviewViewport,styleId);//设置“字幕外观示例”的文本框大小和字
finalLocale locale = mCaptioningManager.getLocale();//得到用户所选语言
if(locale != null){
finalCharSequence localizedText = AccessibilityUtils.getTextForLocale(
context, locale,R.string.captioning_preview_text);
preview.setText(localizedText);//设置“字幕外观示例”的语言
} else{
preview.setText(R.string.captioning_preview_text);
}
finalCaptionStyle style = mCaptioningManager.getUserStyle();//得到用户所选视觉属性
if(style.hasWindowColor()) {
mPreviewWindow.setBackgroundColor(style.windowColor);
} else{
finalCaptionStyle defStyle = CaptionStyle.DEFAULT;
mPreviewWindow.setBackgroundColor(defStyle.windowColor);
}
}
文字颜色和文字不透明度,背景颜色和背景不透明度, 字幕窗口颜色和字幕窗口不透明度,
边缘颜色,边缘类型,字幕样式onValueChanged()
执行的操作是Storea name/value pair into the database.
Settings.Secure.putInt(cr,Settings.Secure.ACCESSIBILITY_CAPTIONING_FOREGROUND_COLOR,merged);
放大手势:
监听事件onPreferenceTreeClick()跳转的AccessibilitySettings类中
handleDisplayMagnificationPreferenceScreenClick()
在这个方法中new一个Bundle,在这个Bunle对象中放数据,数据分别是:标题的名字,文字说明,和用户首选,这个Bunle中的数据是关于跳转的Fragment的数据,最后
super.onPreferenceTreeClick(mDisplayMagnificationPreferenceScreen,mDisplayMagnificationPreferenceScreen);
执行父类的方法跳转到ToggleScreenMagnificationPreferenceFragment
在这个Fragment中
protectedvoidonInstallSwitchBarToggleSwitch() {
super.onInstallSwitchBarToggleSwitch();
mToggleSwitch.setOnBeforeCheckedChangeListener(newOnBeforeCheckedChangeListener() {
@Override
publicbooleanonBeforeCheckedChanged(ToggleSwitch toggleSwitch, booleanchecked) {
mSwitchBar.setCheckedInternal(checked);
getArguments().putBoolean(AccessibilitySettings.EXTRA_CHECKED,checked);
onPreferenceToggled(mPreferenceKey,checked);
returnfalse;
}
});
}
mToggleSwitch是从父类(ToggleFeaturePreferenceFragment)得到的,父类得到方式与字幕中得到开启开关方式相同
大号字体:
监听事件onPreferenceTreeClick()监听的AccessibilitySettings类中
handleToggleLargeTextPreferenceClick()
在这个方法中先去判断控件的true或者false再执行
ActivityManagerNative.getDefault().updatePersistentConfiguration(mCurConfig);
framwork层去更新设置
高对比度文字:
监听事件onPreferenceTreeClick()监听的AccessibilitySettings类中
handleToggleTextContrastPreferenceClick()
在这个方法中执行
Settings.Secure.putInt(getContentResolver(),
Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED,(mToggleHighTextContrastPreference.isChecked()? 1 : 0));
将值放入数据库
按通话按你结束通话:
监听事件onPreferenceTreeClick()监听的AccessibilitySettings类中
handleTogglePowerButtonEndsCallPreferenceClick()
在这个方法中执行
Settings.Secure.putInt(getContentResolver(),Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR,
(mTogglePowerButtonEndsCallPreference.isChecked()?
Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR_HANGUP:Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR_SCREEN_OFF));
将值放入数据库
自动旋转屏幕:
监听事件onPreferenceTreeClick()监听的AccessibilitySettings类中
handleLockScreenRotationPreferenceClick()
在这个方法中执行
RotationPolicy.setRotationLockForAccessibility(getActivity(),!mToggleLockScreenRotationPreference.isChecked());
framwork层去设置旋转
说出密码:
监听事件onPreferenceTreeClick()监听的AccessibilitySettings类中
handleToggleSpeakPasswordPreferenceClick()
在这个方法中执行
Settings.Secure.putInt(getContentResolver(),
Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD,mToggleSpeakPasswordPreference.isChecked()? 1 : 0);
将值放入数据库
无障碍快捷方式:
与放大手势相同,只是方法和跳转的Fragment不同
handleToggleEnableAccessibilityGesturePreferenceClick()
ToggleGlobalGesturePreferenceFragment
监听事件:
protectedvoidonInstallSwitchBarToggleSwitch() {
super.onInstallSwitchBarToggleSwitch();
mToggleSwitch.setOnBeforeCheckedChangeListener(newOnBeforeCheckedChangeListener() {
@Override
publicbooleanonBeforeCheckedChanged(ToggleSwitch toggleSwitch, booleanchecked) {
mSwitchBar.setCheckedInternal(checked);//设置开关
getArguments().putBoolean(AccessibilitySettings.EXTRA_CHECKED,checked);//将值放入
onPreferenceToggled(mPreferenceKey,checked);//更新值
returnfalse;
}
});
文字转语音(TTS)输出:
自动跳转TextToSpeechSettings
onCreate()方法中
addPreferencesFromResource(R.xml.tts_settings);
初始化控件
需要说一下的
List<EngineInfo> engines =mEnginesHelper.getEngines();
for(EngineInfo engine : engines) {
TtsEnginePreferenceenginePref = newTtsEnginePreference(getActivity(), engine,
this,activity);
mEnginePreferenceCategory.addPreference(enginePref);
}
finalint engineCount =mEnginePreferenceCategory.getPreferenceCount();
for(inti = 0; i < engineCount; ++i) {
finalPreference p = mEnginePreferenceCategory.getPreference(i);
if(p instanceofTtsEnginePreference) {
TtsEnginePreferenceenginePref = (TtsEnginePreference) p;
if(enginePref.getKey().equals(engine)) {
enginePref.setVoiceDataDetails(data);
break;
这里会去newTTS控件,列出TTS的apk,
点击PicoTTS后进入设置的TtsEngineSettingsFragment
onCreate()方法中
addPreferencesFromResource(R.xml.tts_engine_settings);
初始化
监听事件
mLocalePreference= (ListPreference) root.findPreference(KEY_ENGINE_LOCALE);//语言
mLocalePreference.setOnPreferenceChangeListener(this);
mEngineSettingsPreference= root.findPreference(KEY_ENGINE_SETTINGS);//设置
mEngineSettingsPreference.setOnPreferenceClickListener(this);
mInstallVoicesPreference= root.findPreference(KEY_INSTALL_DATA);//安装数据包
mInstallVoicesPreference.setOnPreferenceClickListener(this);
由于没有安装TTS所以未实现
触摸和按住延迟:
监听事件onPreferenceChange()监听的AccessibilitySettings类中
handleLongPressTimeoutPreferenceChange()
在这个方法中
Settings.Secure.putInt(getContentResolver(),
Settings.Secure.LONG_PRESS_TIMEOUT,Integer.parseInt(stringValue));
mSelectLongPressTimeoutPreference.setSummary(
mLongPressTimeoutValuetoTitleMap.get(stringValue));
将值放入数据库,并设置这个控件的Summary
颜色反转:
监听事件onPreferenceChange()监听的AccessibilitySettings类中
handleToggleInversionPreferenceChange(booleanchecked)
在这个方法中
Settings.Secure.putInt(getContentResolver(),
Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED,(checked ? 1 : 0));
将值放入数据库
色彩校正:
自动跳转进入的是ToggleDaltonizerPreferenceFragment
在这个Fragment的oncreate方法中
addPreferencesFromResource(R.xml.accessibility_daltonizer_settings);
这个布局中有两个控件Preference和ListPreference,
然后初始化控件initPreferences();
监听事件:
校正模式:
mType= (ListPreference) findPreference("type");//校正模式
监听事件onPreferenceChange()
Settings.Secure.putInt(getContentResolver(),TYPE,Integer.parseInt((String)newValue));
preference.setSummary("%s");
将值放入数据库,并设置控件summary
开启关闭:
从父类得到,与上面的开启关闭控件方式一致
监听事件onSwitchChanged()
最后去执行
onPreferenceToggled()
Settings.Secure.putInt(getContentResolver(),ENABLED,enabled ? 1 : 0);
将值放入数据库