2010-10-07 14 views
1

J'ai essayé d'utiliser un SeekBar pour la première fois, et j'ai été déçu des résultats. J'ai une application qui doit utiliser un curseur pour couvrir 80 spots. Je veux que l'utilisateur puisse se déplacer par incréments de 0,5 (c'est-à-dire 10,5, 11,0). Ma gamme maximale est de 40, c'est pourquoi je l'ai doublé à 80 pour tenir compte des décimales.Comment puis-je ajuster la sensibilité Android SeekBar

Tout a fonctionné, mais quand je l'ai mis sur mon Droid, la performance a été terrible à mon avis. En essayant de s'arrêter en 21.5, le curseur s'arrêtait généralement à 22.0 ou 22.5, et je devais prendre plus de temps pour essayer de le renverser. D'autres fois, je voudrais essayer de sélectionner le curseur et il ne répondait pas. Je ne suis pas aussi préoccupé par l'absence de réponse, mais je ne peux pas mettre le SeekBar dans mon application si elle nécessite que l'utilisateur ait la précision exacte pour atteindre un certain endroit.

Est-ce qu'il y a quelque chose que je peux faire pour ajuster le SeekBar de sorte qu'il soit facile d'atteindre le numéro que vous essayez d'atteindre sans difficulté? Je ne suis pas sûr si le problème se produit parce que mon SeekBar contient une grande quantité de valeurs possibles, et avec la taille de l'écran limitée cela force les nombres à briser plus près ensemble? Ou si c'est juste la façon dont il se comporte en général.

S'il n'y a pas un bon moyen d'ajuster la sensibilité, existe-t-il une bonne alternative que je peux utiliser et qui offre des fonctionnalités similaires?

Répondre

2

Je ne sais pas si le problème est se produit parce que mon SeekBar contient une grande quantité de valeurs possibles, et avec la taille de l'écran limité cette force les chiffres à rapprocher fracassé ensemble?

À peu près ceci. Une chose que vous pourriez faire est d'ajouter un petit bouton plus et moins à côté de la barre de recherche, qui incrémente et décrémente la valeur de 0,5. De cette façon, vous pouvez toujours utiliser la barre de recherche pour les cas généraux, et affiner votre sélection avec les boutons si nécessaire. Peut-être pas la solution la plus élégante, mais cela fonctionnerait certainement.

+0

C'est une bonne idée, je vais devoir essayer ça. Merci kcoppock – Michael

+0

De rien. C'est l'une des choses qui m'a toujours embêté sur les écrans tactiles, c'est le manque de précision pour des choses comme ça. J'ai quelques options de réglage fin. :RÉ – kcoppock

4

J'ai exactement le même problème et j'ai trouvé ma propre façon de réduire la sensibilité. Le problème pour moi se produit quand je quitte le curseur et il est involontairement repositionné, à cause de l'épaisseur des doigts etc. J'ai donc écrit une minuterie pour voir si la position a été sélectionnée pendant un certain temps et enclenche à cette position tout en laissant la barre de recherche . Cette méthode est un peu maladroite mais c'est le mieux que je puisse penser, étant donné que je ne veux pas de boutons +/- comme suggéré ci-dessus. Cela fonctionne bien pour mes besoins. Voici le code pour toute personne intéressée:

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); 
      } 
     });