2012-05-06

Quelques conseils sur SeekBar.setThumb()

Toujours dans mon projet de tracking GPS, j'utilise une SeekBar comme feedback de l'état de progression. Le véhicule se déplace sur toute la longueur de l'écran symbolisant la distance parcourue depuis l'événement n-1 et celle à parcourir avant l'évènement n.

Techniquement, la SeekBar, barre de progression, utilise un curseur (nommé thumb) qui est un Drawable.

Problème 1 : afficher complètement le thumb.

Lorsque la progression de la SeekBar est à 0, le curseur était affiché à moitié. Réciproquement une seule moitié était affichée lorsque le curseur est au maximum.
La solution se trouve dans la documentation de l'API :
sb.setThumbOffset(0);
Explication par le source Android AbsSeekBar.java:
108    // Assuming the thumb drawable is symmetric, set the thumb offset
109    // such that the thumb will hang halfway off either edge of the
110    // progress bar.
111    mThumbOffset = thumb.getIntrinsicWidth() / 2;

Problème 2 : setThumb fait disparaître le curseur.

Quelques secondes après l'affichage du Drawable comme curseur, ce dernier disparaissait.
La solution a été donnée par Romain GUY, il faut refaire une étape de setThumb() (cf paragraphe précédent)
Drawable retourDrawable;
retourDrawable = getResources().getDrawable(
  R.drawable.voituremgps1234);
retourDrawable.setBounds(new Rect(0, 0, 
  retourDrawable.getIntrinsicWidth(),
  retourDrawable.getIntrinsicHeight()));
sb.setThumb(retourDrawable);

Problème 3 : setThumb remet le curseur à 0

Ce problème m'a donné pas mal de fil à retordre. La responsabilité de setThumb dans le repositionnement du curseur n'est pas immédiate. C'est en procédant au pas à pas que le lien m'est apparu. Concrètement, le curseur est positionné à zéro mais ne réponds pas aux ordres de repositionnement.

C'est probablement dans l'API mais je n'ai pas trouvé.

Mon conseil est de mettre le curseur à une valeur nulle ou négative avant de le remettre à la bonne position :
sb.setThumb(retourDrawable); // Le drawable
sb.setProgress(-1); // progress négatif
sb.setProgress(positionThumb); // progress à la bonne place.
Enregistrer un commentaire