68 votes

Android : Comment détecter la fin d'un défilement ?

J'utilise la méthode onScroll de GestureDetector.SimpleOnGestureListener pour faire défiler un grand bitmap sur un canevas. Lorsque le défilement est terminé, je veux redessiner le bitmap au cas où l'utilisateur voudrait le faire défiler plus loin ... hors du bord du bitmap, mais je ne vois pas comment détecter la fin du défilement (l'utilisateur a retiré son doigt de l'écran).

e2.getAction() semble toujours renvoyer la valeur 2, ce qui ne nous aide pas. e2.getPressure semble renvoyer des valeurs assez constantes (autour de 0,25) jusqu'au dernier appel onScroll où la pression semble tomber à environ 0,13. Je suppose que je pourrais détecter cette réduction de la pression, mais ce sera loin d'être infaillible.

Il doit y avoir un meilleur moyen : quelqu'un peut-il m'aider, s'il vous plaît ?

1voto

resp78 Points 11

Je suis sûr qu'il est trop tard pour vous, cependant, il semble que j'ai trouvé la bonne solution à votre question initiale et pas nécessairement l'intention.

Si vous utilisez l'objet Scroller/OverScroller pour le défilement, vous devez vérifier la valeur de retour de la fonction suivante.

public boolean computeScrollOffset() 

Profitez de

harvinder

1voto

nautilusvn Points 107

Je pense que cela va fonctionner comme vous le souhaitez

protected class SnappingGestureDetectorListener extends SimpleOnGestureListener{

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY){
        boolean result = super.onScroll(e1, e2, distanceX, distanceY);

        if(!result){
            //Do what you need to do when the scrolling stop here
        }

        return result;
    }

}

0voto

Rob Kent Points 3133

Je ne l'ai pas fait moi-même mais en regardant onTouch() on obtient toujours une séquence 0<2>1, donc la fin doit être un 1 pour le lever de doigt.

0voto

Bob Points 4773

Je ne connais pas Android, mais en regardant la documentation, il semble que Rob ait raison : Android ACTION_UP constante Essayez de vérifier la présence d'ACTION_UP dans getAction() ?

Edit : Que montre e1.getAction() ? Renvoie-t-il parfois ACTION_UP ? La documentation dit qu'il retient l'événement initial de descente, donc peut-être qu'il notifie aussi quand le pointeur est en haut

Edit : Seulement deux autres choses auxquelles je peux penser. Est-ce que vous renvoyez false à un moment donné ? Cela peut empêcher ACTION_UP

La seule autre chose que je pourrais essayer est d'avoir un événement séparé, peut-être onDown, et de définir un drapeau dans onScroll tel que isScrolling. Lorsque ACTION_UP est donné à onDown et que isScrolling est activé, vous pouvez faire ce que vous voulez et réinitialiser isScrolling à false. En d'autres termes, en supposant que onDown soit appelé en même temps que onScroll et que getAction renvoie ACTION_UP pendant onDown.

0voto

b0x0rz Points 1174

Je n'ai pas essayé / utilisé ceci mais c'est une idée pour une approche :

arrêter / interrompre le redécoupage du canevas à CHAQUE événement de défilement attendre 1s et ensuite commencer à redécouper le canevas à CHAQUE défilement.

cela conduira à n'effectuer la redécoupe qu'à la fin du défilement, car seul le dernier défilement sera réellement ininterrompu pour que la redécoupe soit terminée.

J'espère que cette idée vous aidera :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X