- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经创建了自己的一组字母发音(取代了常规的 a、b、c、..z)。我想自定义对讲功能,以便在使用我自己的应用程序时使用我自己的声音而不是内置声音。这意味着当视障用户尝试阅读我的应用程序中标签的内容时,他会听到我自己的声音。这可能吗?如果是这样,实现这一目标的正确方法是什么?
最佳答案
假设您自己的声音具有“拼音”,这将非常容易。假设您有字母 A,您希望它发音为“A”而不是“uh”。您只需将“A”替换为“ay”,TalkBack 就会正确发音。假设是这样的话,你想做的事情就很容易了。如果您创建的是实际声音,并且不能像我假设的那样简单地使用语音拼写,就像 alanv 所说的那样,这是不可能的。或者至少,涉及的不仅仅是更改您的应用程序!!!
您要做的是拦截来自您的应用程序的所有辅助功能事件,然后在您拦截这些事件时,将内容描述替换为您的拼音内容描述。棘手的部分是模拟 TalkBack 逻辑以从辅助功能事件中获取文本,以便您获取正确的文本!否则,您最终会修改错误的字符串,或者什么都不做。
如果您将此辅助功能委托(delegate)附加到 View 层次结构中的 View ,则可以覆盖辅助功能节点信息的内容描述,并将其替换为您的语音发音。我附上了我的解决方案的所有相关部分。可能有一种方法可以通过仅处理 Root View 的可访问性委托(delegate)而不是整个 View 层次结构来实现这一点。稍后我可能会调查更多,但这只是花花公子,并且是负载的线性操作(以及动态内容的 View 添加),一点也不差。
将此代码添加到您的 onCreate 方法,并修改“convertText”函数以满足您的需要,您应该已经准备就绪!
final View.AccessibilityDelegate accessiblityDelegate = new View.AccessibilityDelegate() {
String convertText(String argString) {
//Do your phonetic conversion in here!
//A little Regex. A little String replacement and you're golden!
return argString;
}
@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo nodeInfo) {
super.onInitializeAccessibilityNodeInfo(host, nodeInfo);
String text = null;
if (nodeInfo.getContentDescription() != null) {
text = convertText(nodeInfo.getContentDescription().toString());
} else if (nodeInfo.getText() != null) {
text = convertText(nodeInfo.getText().toString());
} else if (host instanceof TextView) {
TextView textView = (TextView)host;
text = convertText(textView.getText().toString());
}
if (text != null) nodeInfo.setContentDescription(text);
}
};
rootView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
addAccessibilityDelegateToViews(v);
}
private void addAccessibilityDelegateToViews(View v) {
v.setAccessibilityDelegate(accessiblityDelegate);
if (v instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup)v;
for (int i = 0; i < viewGroup.getChildCount(); ++i) {
View view = viewGroup.getChildAt(i);
addAccessibilityDelegateToViews(view);
}
}
}
});
关于android 对讲辅助功能 - 自定义声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32629035/
我想使用“SpeechSynthesizer”来朗读文本,但该文本包含一些 XML 标记。使用旧的 COM 对象,我使用了 S5Voice.Speak uString, SVSFDefault Or
我对 MIT OCW Python 第 3 课有疑问。 根据简单的数学计算,她使用的代码应该不会成功。 ## EXAMPLE: approximate cube root ##############
从 CSP193p 2015 第 15 讲开始,prepareForSegue 中的以下代码将弹出窗口的高度最小化为 iPad 上的两行标签和文本字段: let minimumSize =
我目前正在尝试完成 iTunes U 上的 Swift 类(class),我们正在构建一个计算器。我无法理解部分代码。 我在下面添加了我认为与文件相关的代码。 让我感到困惑的是:为什么 operati
无法理解 PHRASES 部分的代码。这是《Python 艰难之路》中的代码。那部分之后我很失落。有人可以解释一下吗? 书中没有对下面的代码进行任何解释。 import random from url
此问题来自 MIT Python 类(class) 6.00.1X,Lectrue 8。我尝试了两段略有不同的代码。两者都是为了计算每个学生的平均成绩。 第一个代码没有考虑到可能存在字母等级,第二个代
在第 6 讲 Stanford iOS9 2016 系列讲座中,程序中添加了一个名为 VCL.swift 的文件来演示 View Controller 生命周期。 我已经添加了文件,但是对于行 "pr
我是一名优秀的程序员,十分优秀!