1

我正在尝试使用滑动手势来处理 EditText。然而,我尝试的一切往往都是错误的。

当我返回 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;
    }    

}
4

1 回答 1

-1

您可以使用来处理滑动事件。如果您点击链接,还有很多关于如何执行此操作的其他问题。本质上,您可以执行以下操作:

//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];
        }
    }
});

您可以从http://bit.ly/droidquery获取droidQuery

于 2013-08-23T20:04:42.400 回答