Setting 模块之辅助功能

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,这个布局就是这个界面的那张图

实际是两个控件SubtitleViewImagView


介绍一下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控件,列出TTSapk


点击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

在这个Fragmentoncreate方法中

addPreferencesFromResource(R.xml.accessibility_daltonizer_settings);

这个布局中有两个控件PreferenceListPreference

然后初始化控件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);

将值放入数据库







  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值