Вопрос

I'm trying a wild idea here by putting a custom control within the items of a certain list view. The control is only "activated" if the user touches down on a certain trigger point and then they can "drag around."

My question is, what can I do in onTouchEvent(...) to prevent the listview from receiving the event and scrolling. Right now I can touch and get ahold of the control, but if I move my finger too much up or down the listview takes over and starts scrolling, then my view doesn't even receive a ACTION_UP event.

Here is my current onTouchEvent code:

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;

}

I'm sure it has something to do with the event hierarchy in some fashion.

Это было полезно?

Решение

finally learned the correct way to do this: requestDisallowInterceptTouchEvent

Другие советы

This might not be exactly what you're looking for, but it's possible to implement capture capabilities in your activity. add

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

to your activity, then simply pass your view on ACTION_DOWNand null on ACTION_UP. it's not exactly pretty, but it works. i'm sure there's a proper way to do this though.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top