2011-07-06 4 views
5

Mise à jour: J'ai compris ce qui se passait. Voir les commentaires. J'essaye d'écrire un ViewSwitcher qui passe tous les gestes à son premier enfant jusqu'à ce qu'il reçoive un geste d'échelle; il les passe ensuite à son deuxième enfant jusqu'à ce que l'enfant soit complètement rétrogradé complètement, quand il revient au premier enfant. Ma sous-classe a une ScaleGestureDetector et je fait un auditeur très simple:Echec de la méthode ScaleGestureDetector.OnScaleGestureListener.onScaleEnd()

protected class OnScaleModeSwitcher implements ScaleGestureDetector.OnScaleGestureListener 
    { 
     protected PageFlipSwitcher owner; 

     public OnScaleModeSwitcher(PageFlipSwitcher newOwner) 
     { 
      super(); 
      owner = newOwner; 
     } 

     @Override 
     public boolean onScale(ScaleGestureDetector detector) { 
      return false; 
     } 

     @Override 
     public boolean onScaleBegin(ScaleGestureDetector detector) { 
      owner.onScaleBegin(); 
//returning false here causes the rest of the gesture to be ignored. 
      return false; 
     } 

     @Override 
     public void onScaleEnd(ScaleGestureDetector detector) { 
      owner.onScaleEnd(); 
     } 
    } 

Comme vous pouvez le voir tout ce qu'il fait est de prendre une référence à l'objet propriétaire de la construction, puis passer quelques événements à des méthodes au sein de la classe propriétaire. Toutefois, onScaleEnd() n'est pas atteint par le code. Je suis conscient que onInterceptTouchEvent peut être un peu risqué; J'ai suivi les suggestions dans les docs Android pour aussi près que possible et

@Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) 
    { 
     onTouchEvent(ev); 
     return false; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent ev) 
    { 
//mode is the name of the ScaleGestureDetector 
     mode.onTouchEvent(ev); 

//this code just passes events to the children 
//it seems to work OK 
     if(zoomActive) 
     { 
      //ZoomSwitcher 
      getChildAt(1).onTouchEvent(ev); 
     } 
     else 
     { 
      //Gallery 
      getChildAt(0).onTouchEvent(ev); 
     } 
     return true; 
    } 

Je lis quelque part ailleurs qu'un GestureDetector ne peut pas recevoir l'événement ACTION_UP:

Android: How to detect when a scroll has ended

Est-ce que ce qui est qui se passe ici? Si oui, quel est le point de la méthode onScaleEnd()?

EDIT:

J'ai travaillé ceci: il est parce que mes méthodes renvoient faux. Eclipse a auto-implémenté certains stubs et je n'ai pas modifié les valeurs de retour lorsque je les ai remplis.

Répondre

7

Si un ScaleGestureDetector est défini qui renvoie false à partir de onScaleBegin (...), aucune des méthodes suivantes ne sera touchée . Généralement, les méthodes qui consomment un événement MotionEvent mais qui retournent false n'obtiennent pas les événements MotionEvents suivants après ACTION_UP, lorsque les écouteurs sont réinitialisés.

Questions connexes