Android SeekBar对话,谈得太多

时间:2016-05-01 20:24:20

标签: java android accessibility talkback

(Android)在音乐播放器上,您可以按预期更新搜索栏:

PRECISION_SEEKBAR = 100000;
((SeekBar) findViewById(R.id.seekBar2)).setMax(PRECISION_SEEKBAR);

timerSeekBarUpdate.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                final SeekBar seekBar = (SeekBar) findViewById(R.id.seekBar);

                @Override
                public void run() {
                    if (control == null || player == null) {
                        cancel();
                        return;
                    }
                    seekBar.setProgress((int) (player.getCurrentPosition() * PRECISION_SEEKBAR / player.getDuration()));
                    ...

但是,如果焦点在搜索栏上,则会稳定地进行对讲,并且不间断地为进度提供反馈。喜欢"寻求控制25%","寻求控制25%","寻求控制25%","寻求控制26%" 34;,"寻求控制26%","寻求控制27%"

我错过了但却无法解决问题。我已将contentDescription设置为@null以外的其他内容。但是这次它不停地读取内容描述。

在Spotify客户端上,我查了一下,它将进度读作" xx%"就一次。尽管将注意力集中在搜索栏上。

当我将精度编辑为1或100时,会丢失搜索条上的精度。看起来歌曲中有一些部分。您可以通过在搜索栏上滑动来播放一个或另一个。

有没有人经历过这样的事?我无法在谷歌文档,堆栈网络或其他任何地方找到任何东西。

2 个答案:

答案 0 :(得分:0)

我遇到了问题,发现SeekBar会在每次更新时读取百分比。

它有帮助,我只在百分比改变时更新SeekBar但仍然保持高精度(在我的情况下以毫秒为单位)。

@Override
public void updateSeekBar(final int currentPosInMillis, final int durationInMillis) {
    long progressPercent = calculatePercent(currentPosInMillis, durationInMillis);

    if (progressPercent != previousProgressPercent) {
        seekBar.setMax(durationInMillis);
        seekBar.setProgress(currentPosInMillis);
    }
    previousProgressPercent = progressPercent;
}

private int calculatePercent(int currentPosInMillis, int durationInMillis) {
    if(durationInMillis == 0) {
        return 0;
    }
    return (int) (((float)currentPosInMillis / durationInMillis) * 100);
} 

previousProgressPercent初始化为-1。

请注意,此解决方案与Spotify不同。
当SeekBar被选中时,Spotify会覆盖系统公布的消息 这有以下2种效果:

  • 可以根据需要随时进行更新,而不会重复百分比
  • 如果在选择SeekBar时百分比发生变化,则无法宣布任何内容

第2点可能是一个缺点,取决于你想要达到的目标。

答案 1 :(得分:0)

您可以覆盖sendAccessibilityEvent(),以便忽略描述更新:

@Override
public void sendAccessibilityEvent(int eventType) {
    if (eventType != AccessibilityEvent.CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION) {
        super.sendAccessibilityEvent(eventType);
    }
}

正如Altoyyr所说,这具有忽略所有描述更新的副作用,包括使用音量按钮滚动。因此,您需要添加回发送事件以进行批量按下操作:

@Override
public boolean performAccessibilityAction(int action, Bundle arguments) {
    switch (action) {
        case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD:
        case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: {
            super.sendAccessibilityEvent(AccessibilityEvent.CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION);
        }
    }
    return super.performAccessibilityAction(action, arguments);
}