如何调整Android SeekBar灵敏度

时间:2010-10-07 19:19:06

标签: android seekbar

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

一切正常,但是当我把它放在我的Droid上时,我认为表现非常糟糕。当试图在21.5停止时,滑块通常停在22.0或22.5,我不得不花费额外的时间尝试将其滑过。其他时候我会尝试选择滑块,它没有响应。我并不关心无反应,但如果要求用户精确到达某个位置,我就不能将SeekBar放入我的应用程序中。

我可以做些什么来调整SeekBar,以便轻松击中你试图降落的数字吗?我不确定问题是否正在发生,因为我的SeekBar包含大量可能的值,并且屏幕尺寸有限,这会迫使数字被打得更近?或者,如果这只是它的行为方式。

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

2 个答案:

答案 0 :(得分: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);
            }
        });

答案 1 :(得分:2)

  

我不确定问题是否存在   发生因为我的SeekBar包含   大量可能的值,和   屏幕尺寸限制了这种力量   数字要被打得更近了   一起?

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