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