2010-10-07 2 views
1

Я попытался использовать SeekBar в первый раз, и я был разочарован результатами. У меня есть приложение, которое должно использовать ползунок для покрытия 80 точек. Я хочу, чтобы пользователь мог двигаться с шагом в 5 дюймов (т. Е. 10,5, 11,0). Мой максимальный диапазон - 40, поэтому я удвоил его до 80 для учета десятичных знаков.Как я могу настроить Android SeekBar Чувствительность

Все сработало, но когда я положил его на свой дроид, выступление было ужасным, на мой взгляд. Когда вы пытались остановиться на 21,5, слайдер обычно останавливался на 22,0 или 22,5, и мне пришлось взять дополнительное время, чтобы попытаться заткнуть его. В других случаях я бы попытался выбрать слайдер, и он не реагировал. Я не так обеспокоен проблемой безответственности, но я не могу поместить SeekBar в свое приложение, если это требует от пользователя точной точности, чтобы попасть в определенное место.

Есть ли что-нибудь, что я могу сделать, чтобы настроить SeekBar так, чтобы было легко попасть в число, на которое вы пытаетесь приземлиться без труда? Я не уверен, возникает ли проблема, потому что мой SeekBar содержит большое количество возможных значений, и с ограниченным размером экрана это приводит к тому, что числа будут разбиты ближе друг к другу? Или, если это так, как ведет себя в целом.

Если нет хорошей возможности настроить чувствительность, есть ли хорошая альтернатива, которую я могу использовать, которая обеспечивает аналогичную функциональность?

ответ

2

Я не уверен, если проблема происходит потому, что мой SeekBar содержит большое количество возможных значений, и с размером экрана ограничен эти силы числа, чтобы быть ближе разбили вместе?

В значительной степени это. Единственное, что вы можете сделать, это добавить небольшую кнопку плюс и минус рядом с поисковым баром, которые увеличивают и уменьшают значение на 0,5. Таким образом, вы по-прежнему можете использовать панель поиска для общих случаев и, если необходимо, уточните свой выбор с помощью кнопок. Возможно, это не самое элегантное решение, но это, безусловно, сработает.

+0

Это хорошая идея, мне, возможно, придется попробовать это. Спасибо kcoppock – Michael

+0

Добро пожаловать. Это одна из вещей, которые всегда беспокоили меня о сенсорных экранах, - это отсутствие точности для подобных вещей. Я <3 меня некоторые тонкие настройки. : D – kcoppock

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); 
      } 
     }); 
Смежные вопросы