Pour y revenir après quelques mois, j'ai adopté une approche différente : j'utilise un gestionnaire (comme dans l'exemple Android Snake) pour envoyer un message à l'application toutes les 125 millisecondes, lui demandant de vérifier si un défilement a été lancé et si plus de 100 millisecondes se sont écoulées depuis le dernier événement de défilement.
Cela semble fonctionner assez bien, mais si quelqu'un voit des inconvénients ou des améliorations possibles, je lui en serai reconnaissant.
Le code correspondant se trouve dans la classe MyView :
public class MyView extends android.view.View {
...
private long timeCheckInterval = 125; // milliseconds
private long scrollEndInterval = 100;
public long latestScrollEventTime;
public boolean scrollInProgress = false;
public MyView(Context context) {
super(context);
}
private timeCheckHandler mTimeCheckHandler = new timeCheckHandler();
class timeCheckHandler extends Handler{
@Override
public void handleMessage(Message msg) {
long now = System.currentTimeMillis();
if (scrollInProgress && (now>latestScrollEventTime+scrollEndInterval)) {
scrollInProgress = false;
// Le défilement est terminé, il faut insérer le code ici.
// qui appelle la méthode doDrawing()
// pour redessiner le bitmap recentré à l'endroit où le défilement s'est terminé.
[ layout or view ].invalidate();
}
this.sleep(timeCheckInterval);
}
public void sleep(long delayMillis) {
this.removeMessages(0);
sendMessageDelayed(obtainMessage(0), delayMillis);
}
}
}
@Override protected void onDraw(Canvas canvas){
super.onDraw(canvas);
// code pour dessiner un grand tampon bitmap sur le canevas de la vue // positionné de manière à tenir compte de tout défilement en cours.
}
public void doDrawing() {
// code pour faire un dessin détaillé (et qui prend du temps) // sur un grand tampon bitmap
// l'instruction suivante remet à zéro l'horloge Time Check // L'horloge est lancée pour la première fois lorsque // l'activité principale appelle cette méthode au démarrage de l'application.
mTimeCheckHandler.sleep(timeCheckInterval);
}
// reste de la classe MyView
}
et dans la classe MyGestureDetector
public class MyGestureDetector extends SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
[MyView].scrollInProgress = true;
long now = System.currentTimeMillis();
[MyView].latestScrollEventTime =now;
[MyView].scrollX += (int) distanceX;
[MyView].scrollY += (int) distanceY;
// l'instruction suivante appelle la méthode onDraw de la vue // qui trace le bitmap de la mémoire tampon sur l'écran // décalée pour tenir compte du scroll.
[MyView].invalidate();
}
// reste de la classe MyGestureDetector
}