Андроид: Как перестать смотреть.OnTouchListener действие ход


У меня есть простое действие слайда для LinearLayout View с использованием TouchListener.

Проблема в том, что MotionEvent.ACTION_MOVE продолжает вызываться, когда я касаюсь и двигаюсь.

Как я могу остановить MotionEvent.ACTION_MOVEот вызова?

v.setOnTouchListener(null) нехорошо: возвращает false и не работает.

Я хочу, чтобы MotionEvent.ACTION_MOVE был вызван только один раз.

    private View.OnTouchListener touchEvent = new View.OnTouchListener() {
        private float tempX;
        private final float BASE_VALUE = 100;
        private final boolean LEFT = false;
        private final boolean RIGHT = true;

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub

            if(event.getAction() == MotionEvent.ACTION_DOWN){
                tempX = event.getX();
            }

            if(event.getAction() == MotionEvent.ACTION_MOVE){
                if(event.getX() < (tempX + BASE_VALUE)){
                    changeView(LEFT);
                }else if(event.getX() > (tempX + BASE_VALUE)){
                    changeView(RIGHT);
                }
            }

Он не работает идеально.

Но эта реализация не плоха (этот код-моя идея).

Код:

private View.OnTouchListener touchEvent = new View.OnTouchListener() {
    private VelocityTracker mVelocityTracker;
    private float tempX;
    private final int MIN_DISTANCE = 120;
    private final int THRESHOLD_VELOCITY = 200; 
    private final boolean LEFT = false;
    private final boolean RIGHT = true;
    private MotionEvent cancelEvent = MotionEvent.obtain(100, 100, MotionEvent.ACTION_CANCEL, 0, 0, 0);
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
        if(event.getAction() == MotionEvent.ACTION_DOWN){
            Log.d(TAG, "Down");
            mVelocityTracker = VelocityTracker.obtain();
            mVelocityTracker.addMovement(event);
            tempX = event.getX();
        }
        if(event.getAction() == MotionEvent.ACTION_MOVE){
            mVelocityTracker.addMovement(event);
            mVelocityTracker.computeCurrentVelocity(100);
            float velocityX = mVelocityTracker.getXVelocity();
            if(tempX - event.getX() > MIN_DISTANCE 
                   && Math.abs(velocityX) > THRESHOLD_VELOCITY){
                   Log.d(TAG, "LEFT");
                   changeView(LEFT);
            }else if(event.getX() - tempX > MIN_DISTANCE 
                   && Math.abs(velocityX) > THRESHOLD_VELOCITY){
                   Log.d(TAG, "RIGHT");
                   changeView(RIGHT);
            }
            v.dispatchTouchEvent(cancelEvent);
        }
2 2

2 ответа:

Сделайте SWIPELISTENER.

Код.

import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;


public abstract class OnSwipeListener implements OnTouchListener {
public final static int SWIPED_LEFT = 1;
public final static int SWIPED_RIGHT = 2;
public final static int SWIPED_UP = 3;
public final static int SWIPED_DOWN = 4;
public final static int CLICKED = 5;

private int SWIPE_ACTION = 0;
private float firstTouchX = 0;
private float firstTouchY = 0;
private float lastTouchX = 0;
private float lastTouchY = 0;
private int activePointerID;

@Override
public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
    if(event.getAction() == event.ACTION_DOWN){
        final float x = event.getX();
        final float y = event.getY();

        firstTouchX = x;
        firstTouchY = y;

        activePointerID = event.getPointerId(0);

        v.setBackgroundResource(R.drawable.layoutbutton2);
    }

    if(event.getAction() == event.ACTION_UP){
        float dX = lastTouchX - firstTouchX;
        float dY = lastTouchY - firstTouchY;

        final int pointerIndex = event.findPointerIndex(activePointerID);

        if((firstTouchX + 10) == event.getX(activePointerID) &&
                (firstTouchY + 10) == event.getY(activePointerID)){

            SWIPE_ACTION = CLICKED;

        }else{
            if(Math.abs(dX) > Math.abs(dY)){
                if(dX > 0){
                    SWIPE_ACTION = SWIPED_RIGHT;
                }else{
                    SWIPE_ACTION = SWIPED_LEFT;
                }
            }else{
                if(dY > 0){
                    SWIPE_ACTION = SWIPED_DOWN;
                }else{
                    SWIPE_ACTION = SWIPED_UP;
                }
            }
        }
        v.setBackgroundResource(R.drawable.layoutbutton1);
        onSwipe(v, event);
    }
    if(event.getAction() == event.ACTION_MOVE){
        final int pointerIndex = event.findPointerIndex(activePointerID);
        final float x = event.getX(pointerIndex);
        final float y = event.getY(pointerIndex);

        lastTouchX = x;
        lastTouchY = y;

        v.setBackgroundResource(R.drawable.layoutbutton1);
    }
    if(event.getAction() == event.ACTION_CANCEL){
        v.setBackgroundResource(R.drawable.layoutbutton1);
    }

    return true;

}

public int getSwipeTo(){
    return SWIPE_ACTION;
}

abstract public void onSwipe(View v, MotionEvent event);

}

Я предполагаю, что вы спрашиваете, как завершить событие, когда пользователь поднимает палец? Вы можете просто вызвать ACTION_UP, так как в Пользователь поднял" вверх " свой палец от устройства.

 if(event.getAction() == MotionEvent.ACTION_UP){
           //your code, maybe tempX = null;
        }

Затем вы можете повторно инициализировать свою программу, чтобы она могла принимать прикосновения другого пользователя.