当前位置: 首页 > 知识库问答 >
问题:

AndroidSeekBar对讲,说得太多了

孙成化
2023-03-14

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

java prettyprint-override">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%,“寻找控制26%”,“查找控制27%”

我缺少某物,但无法解决问题。我已将contentDescription设置为除@null之外。但是这次它没有停止读取内容描述。

在Spotify客户端上,我检查了一下,它只读取了一次进度为“xx%”。尽管将焦点保存在搜索栏上。

当我编辑 1 或 100 的精度时,您将失去搜索栏上的精度。看起来这首歌中有几个部分。您可以通过在搜索栏上滑动来玩一个或另一个。

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

共有2个答案

缑勇锐
2023-03-14

我遇到了问题,发现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的不同
选择搜索栏时,Spotify会覆盖系统宣布的消息
这有以下两个影响:

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

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

龚俭
2023-03-14

您可以重写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);
}
 类似资料:
  • 我正在为我的公司设计一个RoR项目,我们的开发团队已经遇到了一些关于设计的争论,特别是数据库。 我们有一个名为的模型,需要持久化。这是一个非常非常小的模型,除了 id 之外只有三个 db 列,但是当我们投入生产时,可能会有很多这样的模型。我们每天看到多达 1,000,000 次插入。模型将只能由其上的两个外键搜索,这些外键可以索引。同样,这些模型永远不必被删除,但我们也不必在它们大约三个月大后保留

  • 问题内容: 我正在构建同时使用HTTP内容和HTTP标头发送和接收数据的AJAX应用程序。是否存在由于HTTP标头太大而无法从HTTP标头接收的数据的问题?如果是,限制是什么,并且在所有浏览器中的行为都一样吗? 我知道从理论上讲HTTP头的大小没有限制,但是在 实践中,有 什么意义呢,在某些平台,浏览器或客户端计算机或计算机上安装的某些软件下,我可能会遇到问题。我正在寻找有关使用HTTP标头的安全

  • 我从quarkus开始,我的构建本机速度太慢(超过一个小时,并已退出内存错误)。我删除了quarkus

  • 有没有一种方法可以让Android accessibility中的对讲功能在片段事务之后说些什么?我基本上希望对讲机在切换后说出片段的名称/标题。这些标题设置为操作栏的标题,可以在那里访问吗?用户可以将手指移动到操作栏中的文本顶部,以了解他们在哪个屏幕上,但除非用户已经熟悉该应用程序,否则用户不会知道。

  • 我在持久化LocalDate字段[在列中使用VARCHAR(20)类型]时收到以下错误: 字段定义如下: 我使用的是spring data starter(1.5.9版本)。它在内部使用hibernate 5.0.12。 根据博文https://www.thoughts-on-java.org/hibernate-5-date-and-time/ Hibernate 5,支持Java 8特性(Da

  • 我使用Windows7和android studio来构建我的应用程序。我在facebook中使用SSO作为登录系统。我遵循以下教程中的步骤。 如何创建Android Facebook密钥哈希? $keytool-exportcert-alias androiddebugkey-keystore“C:\documents and settings\administrator.android\deb