【问题标题】:Android accessible drag-and-dropAndroid可访问的拖放
【发布时间】:2014-04-09 22:38:10
【问题描述】:

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

将此类小部件中的事件公开给诸如 TalkBack 之类的 AccessibilityService 的最佳方式是什么?我一直在查看the documentation on Accessibilitythe documentation on drag-and-drop functionality,我能想到的最好的处理方法是分配一个AccessibilityDelegate,它可以添加正确的实现,或者自定义触发可访问性操作。

【问题讨论】:

  • 我不太确定你会走得太远。我知道的最好的来源是Opera's dev network
  • 谢谢瑞恩;但是,我正在寻找特定于 Android 的“原生”,与 HTML5 移动开发等无关。
  • 您可以触发适当的 TYPE_ANNOUNCEMENT 事件,但目前还没有明确定义的方法来处理可访问性的拖放操作。

标签: android drag-and-drop accessibility


【解决方案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 在此类中的其他任何地方都没有使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 2017-10-15
    • 1970-01-01
    相关资源
    最近更新 更多