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);

将值放入数据库

Setting 模块之辅助功能相关推荐

  1. android Setting模块简介

    Setting模块简介 一.Settings涉及的模块 4.0设置的layout有很大的改变.将设置分为四个部分: WIRELESS & NETWORKS:SIM卡管理,流量使用情况,飞行模式 ...

  2. DCMTK:dcmseg模块的辅助功能

    DCMTK:dcmseg模块的辅助功能 dcmseg模块的辅助功能 dcmseg模块的辅助功能 #include "dcmtk/config/osconfig.h" #includ ...

  3. 【Python】-setting模块的安装

    人生苦短我用Python 安装settings模块其实是需要安装scrapy模块 然后从scrapy导入settings模块 像这样 安装方法一: from scrapy import setting ...

  4. android setting模块,android O版本 设置(Settings)模块总结--设置的一级界面的加载

    O版本的设置界面相对有N有了一些变化,O上面增加了顶级类别的菜单,而之前一些在一级菜单的则移动到了二级界面里面, 如"WIFI","移动网络"等之前是在一级界面 ...

  5. [EntLib]微软企业库5.0 学习之路——第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——上篇...

    本文是为后面的学习之路做铺垫,简单介绍下企业库中的Validation模块的一些相关知识,包括Validation模块的简介.用途.使用方法.默认提供的多种验证器的介绍等. 一.简介及用途 在实际的项 ...

  6. Setting学习(一)-静态界面

    Setting学习(一)-静态界面 设置是整个android系统的重要应用,涉及的都是系统功能 Setting模块的主要路径 :/packages/apps/Settings/ Setting模块里的 ...

  7. Android 系统默认参数的修改

    转自: http://www.th7.cn/Program/Android/201505/447097.shtml 写在前面的话 一般在新项目开始之初,我们需要针对客户需求进行各种系统默认属性的配置, ...

  8. DRBD中文应用指南

    DRBD中文应用指南 写在前面的话: 为了方便学习,将drbd的英文文档翻译出来,以供学习和参考.但因为本人英语水平有限,以及对drbd的了解并不足够深入,翻译中出现很多不通顺或者是语病的地方,请大家 ...

  9. Android系统修改汇总(MTK)

    以下都是基于Android 6.0 的代码去修改的!!! 十四.将桌面workspace.hotseat 大小调整 放大一半 , 这个要根据自己的需求来制定  workspace.setPadding ...

最新文章

  1. sql server 2005 T-SQL @@TOTAL_READ (Transact-SQL)
  2. AtcoderCodeForces杂题11.6
  3. centos安装cowboy过程
  4. Unity3D安卓程序中常用静态方法封装
  5. 华三服务器怎么设置系统启动模式,H3C 开局设置
  6. 关于字符串 --java
  7. feign调用多个服务_Spring Cloud 快速入门系列之feign–微服务之间的调用
  8. 笔记本电脑如何保养_嘉兴专业笔记本电脑喷漆加工厂价格实惠
  9. Linux文件IO(文件的读写)
  10. 【Spring】Unable to start ServletWebServerApplicationContext due to miss ServletWebServerFactory bean
  11. 收藏!50个帮你自我提升的网站
  12. 可以运行python的路由器_用python管理Cisco路由器
  13. 【Django 2021年最新版教程25】模板语言 前端for循环怎么用 实例
  14. python从外部传入参数_Python学习杂记_8_从程序外部传参的办法sys.argv
  15. 前端企业级代码规范(巨详细)
  16. Spring AOP报错Set ‘exposeProxy‘ property on Advised to ‘true‘ to make it available问题
  17. 服务器指的是系统,服务器操作系统指的是什么
  18. Python英文单词大小写转换及所有首字母大写
  19. suse linux 11 xdm图形化,suse xdm 设置
  20. jdk-8u181-windows-x64(JDK1.8)安装包

热门文章

  1. JS - Array - 在数组的指定下标添加或替换元素 。 也可删除指定下标的元素
  2. Libuv Timer定时器
  3. OpenShift 4 - 在单节点 OpenShift 上部署 ODF 存储软件
  4. 做前端开发拿 30W 年薪很难吗?
  5. ctab法提取dna流程图_(完整版)CTAB法提取DNA原理及步骤、制胶、电泳
  6. js将页面转成PDF文档
  7. java树莓派温度传感器_怎样使用树莓派读取传感器上的温度和湿度
  8. 2020BAJT等九大一线大厂的薪资和职级对比
  9. Vue3的filter过滤器代替方法
  10. termux目录_Termux 入门与实践