Android Handling在编辑文本上滑动手势

Android Handling在编辑文本上滑动手势,android,android-edittext,gesture,ontouchlistener,droidquery,Android,Android Edittext,Gesture,Ontouchlistener,Droidquery,我正在尝试使用滑动手势来处理编辑文本。 然而,我尝试的每件事都是有缺陷的 当我返回false时,该手势会起作用,但在进行滑动手势时光标会移动。 然而,当我从GestureListener(onFling)返回结果时,光标保持在原位,但在Android 2.3.3上,手势完成后,文本编辑弹出上下文菜单,在4.1.2上没有上下文菜单,但做出手势将选择整个单词 这是我目前的代码: package com.example.testmarkup; import android.content.Conte

我正在尝试使用滑动手势来处理编辑文本。 然而,我尝试的每件事都是有缺陷的

当我返回false时,该手势会起作用,但在进行滑动手势时光标会移动。 然而,当我从GestureListener(onFling)返回结果时,光标保持在原位,但在Android 2.3.3上,手势完成后,文本编辑弹出上下文菜单,在4.1.2上没有上下文菜单,但做出手势将选择整个单词

这是我目前的代码:

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;
    }    

}
您可以使用来处理刷卡事件。如果你关注这个链接,还有很多关于如何做到这一点的问题。基本上,您可以这样做:

//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];
        }
    }
});
您可以从中获取droidQuery