Захват сенсорных событий в элементе списка Android и предотвращение прокрутки

Я пробую здесь дикую идею, помещая настраиваемый элемент управления в элементы определенного представления списка. Элемент управления «активируется», только если пользователь касается определенной точки срабатывания, а затем он может «перетаскивать».

Мой вопрос в том, что я могу сделать в onTouchEvent(...), чтобы предотвратить получение события и прокрутку списка. Прямо сейчас я могу коснуться и захватить элемент управления, но если я слишком сильно двигаю пальцем вверх или вниз, список берет верх и начинает прокручиваться, тогда мое представление даже не получает событие ACTION_UP.

Вот мой текущий код onTouchEvent:

if (e.getAction() == MotionEvent.ACTION_DOWN) {

    Log.d("SwipeView", "onTouchEvent - ACTION_DOWN" + e.getX() + " " + e.getY());           
    int midX = (int)(this.getWidth() / 2);
    int midY = (int)(this.getHeight() / 2);

    if (Math.abs(e.getX() - midX) < 100 &&
        Math.abs(e.getY() - midY) < 100) {

        Log.d("SwipeView", "HEY");
        setDragActive(true);

    }

    this.invalidate();
    return true;

} else if (e.getAction() == MotionEvent.ACTION_MOVE) {

    _current[0] = e.getX();
    _current[1] = e.getY();

    this.invalidate();
    return true;

} else if (e.getAction() == MotionEvent.ACTION_UP) {

    _current[0] = 0;
    _current[1] = 0;

    setDragActive(false);

    this.invalidate();
    return true;

}

Я уверен, что это как-то связано с иерархией событий.


person cemulate    schedule 06.06.2012    source источник


Ответы (2)


наконец узнал правильный способ сделать это: requestDisallowInterceptTouchEvent

person MrGnu    schedule 25.10.2012

Это может быть не совсем то, что вы ищете, но вы можете реализовать возможности захвата в своей деятельности. добавлять

private View capturedView;
public void setCapturedView(View view) { this.capturedView = view); }

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    return (this.capturedView != null) ?
        this.capturedView.dispatchTouchEvent(event) :
        super.dispatchTouchEvent(event);
}

к вашей активности, затем просто передайте свое представление на ACTION_DOWN и null на ACTION_UP. это не совсем красиво, но это работает. Я уверен, что есть правильный способ сделать это.

person MrGnu    schedule 17.10.2012