2016-07-25 1 views
0

J'essaie de détecter quand une direction de balayage a été modifiée pendant que l'utilisateur continue à glisser sur l'écran.Android OnTouch glisser vers le haut/vers le bas changement de direction

J'ai quelque chose comme ça (très basique) pour détecter la direction de balayage:

@Override 
public boolean onTouch(View view, MotionEvent motionEvent) { 
    int action = motionEvent.getActionMasked(); 

    switch (action) { 
     case MotionEvent.ACTION_DOWN: { 
      Log.d(TAG, "onTouch: DOWN _Y = " + motionEvent.getRawY()); 
      mLastTouchY = mPrevTouchY = motionEvent.getRawY(); 

      break; 
     } 
     case MotionEvent.ACTION_MOVE: { 
      Log.d(TAG, "onTouch: MOVE _Y = " + motionEvent.getRawY()); 

      final float dy = motionEvent.getRawY(); 
      if (dy >= mLastTouchY) { 
       /* Move down */ 

      } else { 
       /* Move up */ 

      } 

      break; 
     } 
     case MotionEvent.ACTION_CANCEL: 
     case MotionEvent.ACTION_OUTSIDE: 
     case MotionEvent.ACTION_UP: { 
      Log.d(TAG, "onTouch: UP _Y = " + motionEvent.getRawY()); 

      // snap page 

      break; 
     } 
    } 

    return true; 
} 

Ce que je dois est de détecter réellement lorsque l'utilisateur a changé la direction du glissement. Par exemple, le code ci-dessus échoue pour détecter certains cas limites:

  1. à partir de Y = 100,
  2. déplacer vers le bas jusqu'à 150,
  3. déplacer jusqu'à 50,
  4. déplacer à nouveau jusqu'à 90

Ce sera détecté comme une balayez vers le haut, car initial Y est supérieure à la dernière Y

+0

Si vous commencez à y = 100, comment iriez-vous jusqu'à y = 150? –

+0

Désolé, j'ai foiré les directions, il est mis à jour maintenant. –

+0

Ce que vous obtenez est en réalité vrai .... Si vous voulez juste la dernière direction du balayage (ce que je comprends de la question), vous devez l'appliquer différemment. –

Répondre

0

Si vous souhaitez détecter le changement de direction du swipe il y a un moyen simple:

private GestureDetector gestureDetector; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     findViewById(R.id.myView).setOnTouchListener(this); 
     gestureDetector = new GestureDetector(this, this); 
    } 

Et vous mettre en œuvre OnTouch et GestureListeners comme ceci:

@Override 
    public boolean onTouch(View v, MotionEvent event) { 
     return gestureDetector.onTouchEvent(event); 
    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
     if (distanceY > 0){ 
      // you are going up 
     } else { 
      // you are going down 
     } 
     return true; 
    } 

    @Override 
    public boolean onDown(MotionEvent e) { 
     return true; 
    } 
    //the rest of the methods you must implement... 
+0

Je vais essayer de passer à GestureDetector, peut-être que c'est plus facile à réaliser. Savez-vous si cela détecte correctement quand vous sortez des limites? –

+0

@IonutNegru Je ne suis pas sûr qu'il le fait. Vous pouvez toujours le tester si;) –

+0

le testera les jours suivants car actuellement je suis pris avec d'autres tâches, mais dès que je le ferai, je reviendrai avec le résultat. Je vous remercie. –