捕获android列表项中的触摸事件并阻止滚动

时间:2012-06-06 03:17:41

标签: android events custom-controls touch android-event

我在这里通过在特定列表视图的项目中放置自定义控件来尝试一个疯狂的想法。只有当用户触摸某个触发点然后他们才能“拖拽”时,控件才会被“激活”。

我的问题是,我可以在onTouchEvent(...)中做些什么来阻止listview接收事件和滚动。现在我可以触摸并获得控件的支持,但是如果我向上或向下移动我的手指过多或下来listview接管并开始滚动,那么我的视图甚至不会收到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;

}

我确信它以某种方式与事件层次结构有关。

2 个答案:

答案 0 :(得分:3)

这可能不是您正在寻找的,但可以在您的活动中实施捕获功能。添加

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上传递您的观点,在ACTION_UP上播放。它不是很漂亮,但它确实有效。我确定有一种正确的方法可以做到这一点。

答案 1 :(得分:2)

终于学到了正确的方法:requestDisallowInterceptTouchEvent