我正在開發查看書籍的應用程序。有一個畫面(活動),顯示一本書。它具有自定義視圖,類似於ViewSwitcher,每個頁面都是由自定義View呈現的位圖。Android中的輔助功能實現問題
現在我應該實現無障礙功能 - 書應該通過電話(音頻)閱讀。
我讀過這裏的輔助功能部分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個符號),所以此問題不會在其上重現,但在Samsung Galaxy Tab 10.1(Android 4.0.4)和Android版的Genymotion模擬器中,使用Android 4.3呢。這是奇怪的...
在美國國家盲人圖書館服務項目中,圖書閱讀器以音頻格式下載圖書。每本書都由專業讀者閱讀。其他輔助功能確實有效,但支持因平臺和Android版本而異。 – maxweber