我正在开发查看书籍的应用程序。有一个屏幕(活动)显示一本书。它有自定义视图,类似于视图切换程序,每个页面都是由自定义视图呈现的位图。
现在我要实现无障碍功能-书应该由电话(音频)读取。
我在这里阅读了可访问性部分,但还不够清楚。
我使用SupportLibrary进行可访问性管理,现在在ViewGroup(管理图书页面)中有了这段代码。代码1:
private class EditionPagesViewSwitcherAccessibilityDelegate extends AccessibilityDelegateCompat {
private int mPageCount;
private double[] mPageRange;
@Override
public void onInitializeAccessibilityEvent(final View host, final AccessibilityEvent event) {
super.onInitializeAccessibilityEvent(host, event);
event.setClassName(EditionPagesViewSwitcher.class.getName());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
event.setScrollable(canScroll());
}
if (event.getEventType() == AccessibilityEventCompat.TYPE_VIEW_SCROLLED && updatePageValues()) {
event.setItemCount(mPageCount);
// we use +1 because of user friendly numbers (from 1 not 0)
event.setFromIndex((int) (mPageRange[0] + 1));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
event.setToIndex((int) (mPageRange[1] + 1));
}
}
}
@Override
public void onInitializeAccessibilityNodeInfo(final View host, final AccessibilityNodeInfoCompat info) {
super.onInitializeAccessibilityNodeInfo(host, info);
info.setClassName(EditionPagesViewSwitcher.class.getName());
info.setScrollable(canScroll());
info.setLongClickable(true);
if (canScrollForward()) {
info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD);
}
if (canScrollBackward()) {
info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD);
}
}
@Override
public boolean performAccessibilityAction(final View host, final int action, final Bundle args) {
if (super.performAccessibilityAction(host, action, args)) {
return true;
}
switch (action) {
case AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD: {
if (canScrollForward()) {
showNext();
return true;
}
}
return false;
case AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD: {
if (canScrollBackward()) {
showPrevious();
return true;
}
}
return false;
}
return false;
}
以下是页面视图代码2中的代码:
@Override
public void onInitializeAccessibilityEvent(final View host, final AccessibilityEvent event) {
super.onInitializeAccessibilityEvent(host, event);
event.setClassName(EditionPageView.class.getName());
if (hasText()) {
event.getText().add(getPageRangeText());
final String trimText = mSurfaceUpdateData.getPageText().trim();
if (trimText.length() > MAX_TEXT_LENGTH) {
event.getText().add(trimText.substring(0, MAX_TEXT_LENGTH));
// event.getText().add(trimText.substring(MAX_TEXT_LENGTH, trimText.length()));
}
else {
event.getText().add(trimText);
}
}
}
@Override
public void onInitializeAccessibilityNodeInfo(final View host, final AccessibilityNodeInfoCompat info) {
super.onInitializeAccessibilityNodeInfo(host, info);
info.setClassName(EditionPageView.class.getName());
}
因为在执行OnInitializeAccessibilityEvent代码时,页面文本数据首次加载异步可访问性没有任何文本。然后,当数据被加载时,我触发accessibilityEvent.type_view_selected和accessibilityEvent.type_view_text_changed事件。然后OnInitializeAccessibilityEvent再次执行,并调用“读取”书籍文本。
所以我的问题是:
我的可访问性实现是否正确?可能是设计错误?因为我没有找到任何关于这个特性的好教程。
为什么我需要在代码1中的支持实现中使用SDK版本检查?为什么支持实现不能正确处理它?
是否确实需要选择点火类型“视图”并更改类型“视图”文本?或者应该实现其他一些代码?
主要问题。在代码2中有注释的代码行。此代码语句子字符串文本小于最大文本长度(它是3800),因为如果文本较大,则不播放任何内容。没有什么。是否有无障碍限制?任何其他小于此值的文本都可以正常播放。
有人知道我在哪里能找到好的教程吗?(是的,我看到了样品)。
是否有人需要查看任何自定义实现?
更新
好。以下是一些答案:
如我所见,如果您不希望在收到文本后立即阅读,则不需要键入“view”和“view”或“text”更改事件。
在Nexus7上,所有的大文本都能很好地播放(文本多达8000个符号),所以这个问题不会在其上重现,但在三星GalaxyTab10.1(Android4.0.4)和Android4.3上,Tab10.1的genymotion模拟器可以。这很奇怪…
最佳答案:
4…根据String.substring()
传递的第一个参数是原始字符串中的开始索引,第二个参数是原始字符串中的结束索引。
例子:
String text = "Hello";
partOfText = text.substring(2,text.length() - 1);
partOfText
等于“llo”(第一个字符是索引0)因此,将常量
MAX_TEXT_LENGTH
作为第一个参数,它将从索引3800开始取出子字符串。http://developer.android.com/reference/java/lang/String.html#substring(int)