如何调整安卓SeekBar的灵敏度

3
我第一次尝试使用SeekBar,但结果令我失望。我有一个应用需要使用滑块来覆盖80个位置。我希望用户能够按照0.5的增量移动(例如10.5、11.0)。我的最大范围是40,所以我将它加倍到80以考虑小数点。
一切都有效,但当我将其放在我的Droid上时,性能非常差。当试图停留在21.5时,滑块通常会停在22.0或22.5处,我必须花费额外的时间来尝试微调。其他时候,我会试图选择滑块,但它没有响应。我不太关心反应迟缓,但如果用户需要精确命中某个位置,我无法将SeekBar放入我的应用中。
有没有办法调整SeekBar,使其易于单击要停留的数字?我不确定是否发生问题是因为我的SeekBar包含大量可能的值,并且屏幕大小有限,这就迫使数字更靠近一起?还是这只是它一般的行为方式。
如果没有好的方法来调整灵敏度,那么有没有提供类似功能的好替代品?
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);
            }
        });

2

我不确定问题是否出现在我的SeekBar上,因为它包含大量可选值,而且屏幕尺寸有限,这迫使数字更加靠近?

基本上就是这样。你可以在SeekBar旁边添加一个小的加减按钮,每次增加或减少0.5的值。这样你仍然可以在常规情况下使用SeekBar,并通过按钮进行微调。也许不是最优雅的解决方案,但肯定能够解决问题。


不客气。触摸屏一直让我感到困扰的问题之一就是缺乏这样的准确性。我喜欢一些微调选项。:D - Kevin Coppock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接