3

我第一次尝试使用 SeekBar,结果令我失望。我有一个需要使用滑块覆盖 80 个点的应用程序。我希望用户能够以 0.5 的增量移动(即 10.5、11.0)。我的最大范围是 40,这就是为什么我将它加倍到 80 以考虑小数。

一切正常,但是当我把它放在我的 Droid 上时,我认为性能很糟糕。当试图停在 21.5 时,滑块通常停在 22.0 或 22.5,我不得不花额外的时间来尝试将其调整过来。其他时候我会尝试选择滑块,但它没有响应。我并不担心反应迟钝,但如果 SeekBar 需要用户精确地到达某个位置,我就不能将它放在我的应用程序中。

我可以做些什么来调整 SeekBar,以便轻松点击您尝试登陆的数字吗?我不确定问题是否正在发生,因为我的 SeekBar 包含大量可能的值,并且由于屏幕尺寸有限,这会迫使数字被粉碎得更近?或者,如果这只是它的一般行为方式。

如果没有调整灵敏度的好方法,我可以使用提供类似功能的好方法吗?

4

2 回答 2

4

我有完全相同的问题,并想出了我自己降低灵敏度的方法。当我离开滑块并且由于手指厚度等原因意外重新定位时,我的问题发生了。所以我写了一个计时器来查看是否选择了一段时间并在离开搜索栏时捕捉到这个位置。这种方法有点笨拙,但这是我能想到的最好的方法,因为我不想要上面建议的 +/- 按钮。它很适合我的需要。这是任何有兴趣的人的代码:

seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
            int lastProgress = 0;
            Timer endTimer = null;
            boolean timerExpired = false;

            class SeekBarTimerTask extends TimerTask {
                public void run() {
                    timerExpired = true;
                }
            }

            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if(timerExpired == false) {
                    // clean up the previous timer and start a new one
                    setTimer();
                }
                else {
                    // if the timer has expired, do not honor small variations of 2%
                    if(Math.abs(progress - lastProgress) <= seekBar.getMax() * 0.02) {
                        seekBar.setProgress(lastProgress);
                        return;
                    }
                    else {
                        // The variation is not small. This means that the seekbar position change
                        // was intentional. Honor it and schedule the timer again.
                        setTimer();
                    }
                }

                lastProgress = progress;
            }

            public void onStartTrackingTouch (SeekBar seekBar) {}
            public void onStopTrackingTouch (SeekBar seekBar) {
                timerExpired = false;
                endTimer.cancel();
                endTimer.purge();
            }

            private void setTimer() {
                if(endTimer != null) {
                    endTimer.cancel();
                    endTimer.purge();
                }

                timerExpired = false;
                endTimer = new Timer();
                endTimer.schedule(new SeekBarTimerTask(), 300);
            }
        });
于 2012-02-04T19:09:50.290 回答
2

我不确定问题是否正在发生,因为我的 SeekBar 包含大量可能的值,并且由于屏幕尺寸有限,这会迫使数字被粉碎得更近?

差不多就是这个。您可以做的一件事是在搜索栏旁边添加一个小的加号和减号按钮,它将值递增和递减 0.5。这样,您仍然可以在一般情况下使用搜索栏,并在需要时使用按钮优化您的选择。也许不是最优雅的解决方案,但它肯定会奏效。

于 2010-10-07T20:10:09.390 回答