我正在开发查看书籍的应用程序。有一个屏幕(活动)显示一本书。它具有自定义视图,类似于 ViewSwitcher,每个页面都是由自定义视图呈现的位图。
现在我应该实现可访问性功能 - 应该通过电话(音频)阅读书籍。
我在这里阅读了可访问性部分https://developer.android.com/guide/topics/ui/accessibility/index.html但还不够清楚。
我使用 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 版本检查?为什么支持实现不能正确处理它?
- 真的需要触发 TYPE_VIEW_SELECTED 和 TYPE_VIEW_TEXT_CHANGED 吗?或者可能应该实现一些其他代码?
- 主要问题。在代码 2 中有注释的代码行。此代码语句子字符串文本小于 MAX_TEXT_LENGTH(它是 3800),因为如果文本更大,则不会播放任何内容。没有什么。是可访问性限制吗?小于此值的任何其他文本都可以正常播放。
- 有谁知道我在哪里可以找到任何好的教程?(是的,我看到了样品)。
- 有没有人有任何自定义实现要查看?
更新
出色地。以下是一些答案:
- 如我所见,如果您不希望在收到此文本后立即阅读,则不需要 TYPE_VIEW_SELECTED 和 TYPE_VIEW_TEXT_CHANGED 事件。
- 在 Nexus 7 上,所有大文本都可以很好地播放(文本最多 8000 个符号),所以这个问题不会在它上面重现,但在三星 Galaxy Tab 10.1(Android 4.0.4)和带有 Android 4.3 的 Tab 10.1 的 Genymotion 模拟器上可以。而这很奇怪……