2013-08-23 5 views
1

J'essaye d'obtenir un mouvement de balayage pour travailler sur un EditText. Cependant, tout ce que j'essaie tend à être bogué.Android manipulant le geste de balayage sur un edittext

Lorsque je renvoie false, le geste fonctionne mais le curseur se déplace lors d'un mouvement de balayage. Cependant quand je renvoie le résultat de GestureListener (onFling) le curseur reste en place, mais sur Android 2.3.3 après que le geste soit terminé le menu contextuel de l'édition de texte apparaît, sur 4.1.2 il n'y a pas de menu contextuel, mais en faisant le geste sélectionnera un mot entier.

Voici mon code actuel:

package com.example.testmarkup; 

import android.content.Context; 
import android.view.GestureDetector; 
import android.view.GestureDetector.SimpleOnGestureListener; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 

public class OnSwipeTouchListener implements OnTouchListener { 

    public interface OnSwipeListener { 
     public void OnSwipe(); 
    } 

    private GestureDetector mGestureDetector = null; 

    private OnSwipeListener mOnSwipeLeftListener; 

    private OnSwipeListener mOnSwipeRightListener; 
    private GestureListener mGestureListener = null; 

    public OnSwipeTouchListener(final Context context) { 
     mGestureListener = new GestureListener(); 
     mGestureDetector = new GestureDetector(context, mGestureListener);  
    } 

    public boolean onTouch(final View view, final MotionEvent motionEvent) { 
     final boolean result = mGestureDetector.onTouchEvent(motionEvent); 
     //When I return false here the gesture works but the cursor moves when making a swipe gesture. 
     //However when I return the result from the GestureListener (onFling) the cursor stay's in place, 
     //but on Android 2.3.3 after the gesture is finished the context menu from the text edit pops up, 
     //on 4.1.2 there is no context menu, but making the gesture will select a whole word. 
//  return false; 
     return result; 

    } 

    private final class GestureListener extends SimpleOnGestureListener { 

     private static final int SWIPE_THRESHOLD = 100; 
     private static final int SWIPE_VELOCITY_THRESHOLD = 100; 

     @Override 
     public boolean onFling(final MotionEvent e1, final MotionEvent e2, final float velocityX, final float velocityY) { 
      boolean result = false; 
      try { 
       final float diffY = e2.getY() - e1.getY(); 
       final float diffX = e2.getX() - e1.getX(); 
       if (Math.abs(diffX) > Math.abs(diffY)) { 
        if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { 
         if (diffX > 0) { 
          onSwipeRight(); 
          result = true; 
         } else { 
          onSwipeLeft(); 
          result = true; 
         } 
        } 
       } else { 
        if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) { 
         if (diffY > 0) { 
          onSwipeBottom(); 
          result = true; 
         } else { 
          onSwipeTop(); 
          result = true; 
         } 
        } 
       } 
      } catch (final Exception exception) { 
       exception.printStackTrace(); 
      } 
      return result; 
     } 

    } 

    public void onSwipeRight() { 
     if (mOnSwipeRightListener != null) 
      mOnSwipeRightListener.OnSwipe(); 
    } 

    public void onSwipeLeft() { 
     if (mOnSwipeLeftListener != null) 
      mOnSwipeLeftListener.OnSwipe(); 
    } 

    public void onSwipeTop() { 
    } 

    public void onSwipeBottom() { 
    } 

    public OnSwipeTouchListener setOnSwipeLeft(final OnSwipeListener aListener) { 
     mOnSwipeLeftListener = aListener; 
     return this; 
    } 

    public OnSwipeTouchListener setOnSwipeRight(final OnSwipeListener aListener) { 
     mOnSwipeRightListener = aListener; 
     return this; 
    }  

} 

Répondre

0

Vous pouvez utiliser pour gérer les événements de glissement. Si vous suivez le lien, il y a beaucoup d'autres questions sur la façon de le faire. Essentiellement, vous pouvez simplement faire quelque chose comme ceci:

//global variables 
private boolean isSwiping = false; 
private SwipeDetector.Direction swipeDirection = null; 
private View v;//set to the parent layout of the fragments. 

//swipe-handling code 
$.with(v).swipe(new Function() { 
    @Override 
    public void invoke($ droidQuery, Object... params) { 
     if (params[0] == SwipeDetector.Direction.START) 
      isSwiping = true; 
     else if (params[0] == SwipeDetector.Direction.STOP) { 
      if (isSwiping) { 
       isSwiping = false; 
       if (swipeDirection != null) { 
        switch(swipeDirection) { 
         case DOWN : 
          //TODO: Down swipe complete, so do something 
          break; 
         case UP : 
          //TODO: Up swipe complete, so do something 
          break; 
         case LEFT : 
          //TODO: Left swipe complete, so do something 
          break; 
         case RIGHT : 
          //TODO: Right swipe complete, so do something (such as): 

          break; 
         default : 
          break; 
        } 
       } 
      } 
     } 
     else { 
      swipeDirection = (SwipeDetector.Direction) params[0]; 
     } 
    } 
}); 

Vous pouvez obtenir droidQuery de http://bit.ly/droidquery.

Questions connexes