Distribution d'événements de vue personnalisée

Chaque sous-classe de ViewGroup dans Android a trois méthodes liées à TouchEvent:

1.public boolean dispatchTouchEvent (événement MotionEvent) Cette méthode est utilisée pour distribuer TouchEvent

2. public boolean onInterceptTouchEvent (événement MotionEvent) Cette méthode est utilisée pour intercepter TouchEvent

3. public boolean onTouchEvent (événement MotionEvent) Cette méthode est utilisée pour gérer TouchEvent

Remarque: toutes les sous-classes View ne sont pas disponibles. Seuls les contrôles qui peuvent y ajouter View doivent être distribués. Par exemple, TextView lui-même est la plus petite vue, il n'est donc pas nécessaire de la distribuer à ses sous-vues, et elle n'a pas de sous-vues. Donc, il n'a pas de dispatch et Intercept, seulement touchEvent.

Donnez un exemple simple: (une activité, un bouton dans la mise en page)

Surveiller le bouton

 button.setOnClickListener(new OnClickListener() {
     @Override
   public void onClick(View v) {
        Log.d("TAG", " onClick");
     }
});


Ajouter un événement tactile au bouton

 button.setOnTouchListener(new OnTouchListener() {
     @Override
    public boolean onTouch(View v, MotionEvent event) {
         Log.d("TAG", "onTouch " + event.getAction());
         return false;
     }
 });

Les résultats de l'exécution sont les suivants:
onTouch 0 équivaut à down
onTouch 1 équivaut à up
événement onClick click
Cela peut être vu à partir des résultats ci-dessus: l'ordre de livraison de l'événement passe d'abord par onTouch, puis par onClick
Lorsque onTouch renvoie false, cela signifie que vous n'avez pas utilisé l'événement onTouch. Après l'exécution du code dans votre onTouch, l'événement onTouch n'est pas terminé.
Lorsque onTouch renvoie true, cela signifie que l'événement a été consommé par onTouch et ne continuera pas à se transmettre.

Regardez ensuite le code source de dispatchTouchEvent

    /**
      * Pass the touch screen motion event down to the target view, or this
      * view if it is the target.
      * @param event The motion event to be dispatched.
      * @return True if the event was handled by the view, false otherwise.
      */
     public boolean dispatchTouchEvent(MotionEvent event) {
         if (!onFilterTouchEventForSecurity(event)) {
             return false;
        }
         if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
                 mOnTouchListener.onTouch(this, event)) {
            return true;
         }
         return onTouchEvent(event);
    }
1. OnTouchListener est défini dans la méthode setOnTouchListener, en fait c'est le setOnTouchListener que nous venons de définir dans Activity, ce qui signifie que tant que nous enregistrons l'événement touch pour le contrôle, mOnTouchListener doit se voir attribuer une valeur

2. La deuxième condition est de juger si le contrôle est activé. Le bouton est vrai même s'il est activé par défaut.

3. La troisième condition est la clé. Cette condition rappellera la méthode onTouch lorsque la commande enregistrera l'événement touch. La clé ici est de voir la valeur de retour de la méthode onTouch.

Une autre question importante est le niveau de transmission des événements Touch. Si vous enregistrez un événement tactile pour un contrôle, une série d'événements ACTION_DOWN, ACTION_MOVE, ACTION_UP et d'autres seront déclenchés chaque fois que vous cliquez dessus. Si vous renvoyez false lors de l'exécution d'ACTION_DOWN, une série d'autres actions ne sera pas exécutée à nouveau. Up. En termes simples, lorsque dispatchTouchEvent est en cours de distribution d'événements, seule l'action précédente retourne true que l'action suivante sera déclenchée.

Je suppose que tu aimes

Origine blog.csdn.net/xifei66/article/details/54583247
conseillé
Classement