Android可访问的拖放功能

时间:2014-04-09 22:38:11

标签: android drag-and-drop accessibility

我正在尝试制作一个可访问的Android应用程序,我们正在实现一种特定类型的拖放式UI小部件(带有一个'抓取器')句柄。

将此类窗口小部件中的事件公开给像TalkBack这样的AccessibilityService的最佳方法是什么?我一直在关注the documentation on Accessibilitythe documentation on drag-and-drop functionality,我能想到的最好的方法是分配一个AccessibilityDelegate来添加正确的实现,或者自定义触发Accessiblity动作。

1 个答案:

答案 0 :(得分:1)

我的应用程序FPlay遇到了同样的问题:我有一个自定义的“滑块”控件,我希望当用户滑动手柄时,TalkBack会说出不同的值。

我的解决方案是在值改变时伪造事件AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED。因此,此解决方案仅适用于API 16+(因为它对我来说足够了,我从未尝试将其移植到较低的API)。

代码:

public final class BgSeekBar extends View {

    ...

    @Override
    public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
        if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED)
            event.setEventType(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
        return super.dispatchPopulateAccessibilityEvent(event);
    }

    //When this method is called from within onTouchEvent(), fromUser is true
    private void setValue(int value, boolean fromUser, boolean usingKeys) {
        if (value < 0)
            value = 0;
        else if (value > max)
            value = max;
        if (this.value != value) {
            this.value = value;
            if (listener != null)
                listener.onValueChanged(this, value, fromUser, usingKeys);
            updateBar();
            if (fromUser)
                sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED);
        }
    }

    ...

}

*值得注意的是:这种解决方法是可行的,因为AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED未在此类别的任何其他位置使用。