onInterceptTouchEvent, onTouchEvent seulement voir ACTION_DOWN

J'ai un haut niveau de ViewGroup, que j'appelle SliderView, dans laquelle je veux détecter le balayage. C'est surtout le travail, mais bizarre le problème persiste.

L'essence de SliderView est de remplacer onInterceptTouchEvent et, une fois que l'utilisateur est en fait un balayage, renvoie "true" pour éviter que d'autres vues de voir le MotionEvent. Voici une capture de code:

public class SliderView extends ViewGroup
{
  enum MoveState { MS_NONE, MS_HSCROLL, MS_VSCROLL };
  private MoveState moveState = MoveState.MS_NONE;

  ... other code ...

  public boolean onInterceptTouchEvent(MotionEvent e)
  {
    final int action = e.getAction();
    switch (action & MotionEvent.ACTION_MASK)
    {
      case MotionEvent.ACTION_DOWN:
        moveState = MoveState.MS_NONE;
        break;

      case MotionEvent.ACTION_MOVE:
        if (moveState == MoveState.MS_NONE)
        {
          if (motion is horizontal)
          {
            moveState = MoveState.MS_VSCROLL;
            return true;
          }
          else
            moveState = MoveState.MS_VSCROLL; //let child window handl MotionEvent
        }
        else if (moveState == MoveState.MS_HSCROLL)
          return true; //don't let children see motion event.
    }
    return super.onInterceptTouchEvent (e);
  }

  ... other code ...
}

C'est ma compréhension que mon SliderView (ce qui est le plus éloigné de la vue) devrait toujours recevie onInterceptTouchEvent. Dans un de mes tests, le niveau supérieur de l'enfant est un Toutefois, dans le cas suivant, cela ne semble pas être.

Lorsque le niveau supérieur de l'enfant est un ScrollView, onInterceptTouchEvent obtient ACTION_MOVE et mon code fait ce que je veux. Dans un autre cas, où le niveau supérieur de l'enfant est un LinearLayout, il échoue parfois: elle obtient toujours ACTION_DOWN mais obtient ACTION_MOVE seulement si l'utilisateur touche un widget à l'intérieur de la LinearLayout; si le fait de toucher zone vide, seulement ACTION_DOWN vient à travers.

Je vais noter qu'il se comporte comme si l'échec de cas sur la touche se passe à l'extérieur de la SliderView. Cependant, si tel était le cas, pourquoi aurais-je obtenir le ACTION_DOWN événements?

Deuxième remarque: en regardant le code source pour le ScrollView, je vois la vérification du mot "inChild"; je n'ai pas compris ce que c'est et comment elle pourrait être pertinente.

avez-vous jamais résoudre ce problème?
non, mais en lisant plus de docs, j'ai appris il ya quelque chose appelé ViewPager, qui intègre un balayage horizontal. Je n'ai pas encore essayé car je suis rajouté d'autres choses maintenant. Je ne sais pas ce que vous cherchez à faire, mais si vous essayez ViewPager s'il vous plaît laissez-moi savoir les résultats.

OriginalL'auteur Peri Hartman | 2012-09-25