将触摸事件(移动/滑动)传递给父级,但在当前视图上保持点击事件

时间:2014-04-27 02:17:26

标签: android events click touch

我有自定义适配器的列表视图。每行都有一些文本和一个可点击的FrameLayout,其上设置了onClickListener。可以使用滑动删除行(例如gmail或环聊)。我正在使用Roman Nurik的SwipeToDismiss库。问题是可点击的FrameLayout占用了行的一半空间,因此很难将行滑开,因为它会消耗MOVE事件。

我已经读过,我可以通过扩展FrameLayout并覆盖dispatchTouchEvent方法将事件传递给父视图。我已尝试过,但随后所有事件都被传递,因此FrameLayout不再可点击。

我也试过这个:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_MOVE) {
       return false;
    }
    return super.dispatchTouchEvent(ev);
}

但看起来一旦视图“得到”了DOWN事件,就不会再将它传递给父级了。

我的问题: 我该怎么做,在当前视图上保留onClick事件,但是将MOVE事件传递给父视图?

1 个答案:

答案 0 :(得分:3)

我得到了它的工作。我扩展了FrameLayout并重写了方法dispathTouchEvent:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_MOVE) {
        //if move event occurs
        long downTime = SystemClock.uptimeMillis();
        long eventTime = SystemClock.uptimeMillis() + 100;
        float x = ev.getRawX();
        float y = ev.getRawY();
        int metaState = 0;
        //create new motion event
        MotionEvent motionEvent = MotionEvent.obtain(
                downTime, 
                eventTime, 
                MotionEvent.ACTION_DOWN, 
                x, 
                y, 
                metaState
        );
        //I store a reference to listview in this layout
        listview.dispatchTouchEvent(motionEvent); //send event to listview
        return true;
    }
    return super.dispatchTouchEvent(ev);
}

现在FrameLayout是可点击的,但是在MOVE发生之后,它会创建一个新的MotionEvent并将其发送到ListView,在那里滚动或刷掉内容。我应该添加一些+ - 来MOVE事件,因为当你用手指按下时,你通常会用它做一些MOVE事件。