Обработка сенсорных событий-onInterceptTouchEvent и onTouchEvent

я хочу иметь возможность проводить в любом месте экрана, чтобы вызвать определенную функцию. Но у меня тоже есть Buttons на Linear Layouts что я хочу иметь возможность нажать на. Если я проведу по Button Я хочу onInterceptTouchEvent до Intercept вызов Button ' s onTouchEvent и выполните действие салфетки. И если я просто нажму на Button Я не хочу onInterceptTouchEvent называться. Скорее, я хочу Button ' s onTouchEvent для вызова и выполнения Button click

но я получаю ошибки при попытке реализации onInterceptTouchEvent.

вот мой код:

public class Game extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.game_activity);

   //other code....
}
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            break;
        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_UP:
            swipeScreen(); //if action recognized as swipe then swipe
            break;
        case MotionEvent.ACTION_MOVE:
            float x = event.getX();
            float y = event.getY();
            float xDelta = Math.abs(x - mLastX);
            float yDelta = Math.abs(y - mLastY);

            if (yDelta > xDelta) {
                return true;
            }
            break;
    }

    return false;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    ButtonOnClick(); //if not a swipe, then button click
    return true;
}

первая ошибка говорит: The method onInterceptTouchEvent(MotionEvent) of type Game must override or implement a supertype method

вместо return true изменить код:return super.onInterceptTouchEvent(event) но затем я получаю сообщение об ошибке сказав: The method onInterceptTouchEvent(MotionEvent) is undefined for the type Activity

может кто-нибудь помочь?

1 ответов


отметим, что onInterceptTouchEvent() метод с ViewGroup класса, а не с Activity.

вы можете достичь желаемого поведения, перемещая свою логику из onInterceptTouchEvent() to dispatchTouchEvent(MotionEvent ev). Не забудьте вызвать реализацию суперкласса dispatchTouchEvent(MotionEvent ev) для обработки событий, которые должны обрабатываться нормально.

также обратите внимание, что вы должны рассматривать движение как салфетки только тогда, когда Дельта больше, чем константа системы для касания помои!--11-->. И я предлагаю убедиться, что пользователь проводит в нужном направлении, тестируя yDelta / 2 > xDelta вместо yDelta > xDelta.

public class Game extends Activity {
    private int mSlop;
    private float mDownX;
    private float mDownY;
    private boolean mSwiping;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.game_activity);

        ViewConfiguration vc = ViewConfiguration.get(this)
        mSlop = vc.getScaledTouchSlop();

       //other code....
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mDownX = ev.getX();
                mDownY = ev.getY();
                mSwiping = false;
                break;
            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_UP:
                if(mSwiping) {
                    swipeScreen(); //if action recognized as swipe then swipe
                }
                break;
            case MotionEvent.ACTION_MOVE:
                float x = ev.getX();
                float y = ev.getY();
                float xDelta = Math.abs(x - mDownX);
                float yDelta = Math.abs(y - mDownY);

                if (yDelta > mSlop && yDelta / 2 > xDelta) {
                    mSwiping = true;
                    return true;
                }
                break;
        }

        return super.dispatchTouchEvent(ev);
    }
}