RecyclerView内部的可滚动MapView:dispatchTouchEvent vs onTouchEvent

时间:2017-04-25 11:05:31

标签: android scroll android-recyclerview

我正在尝试在RecyclerView中滚动MapView,因此我在TouchEvent之前和之后设置requestDisallowInterceptTouchEvent()

奇怪的是:如果我在dispatchTouchEvent()方法中设置它,这确实有效,但如果我在onTouchEvent()方法中执行相同的操作,则无效。

有人可以解释为什么我不能在onTouchEvent()中设置它吗?

工作:

public class WorkingScrollableListItemMapView extends MapView {

    // constructors

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // Stop parents from handling the touch
                this.getParent().requestDisallowInterceptTouchEvent(true);
            break;
            case MotionEvent.ACTION_UP:
                // Allow parents from handling the touch
                this.getParent().requestDisallowInterceptTouchEvent(false);
                break;
        }
        return super.dispatchTouchEvent(ev);
    }
}

不工作:

public class NotWorkingScrollableListItemMapView extends MapView {

    // constructors

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_UP:
                // Allow parents from handling the touch
                this.getParent().requestDisallowInterceptTouchEvent(false);
                break;
            case MotionEvent.ACTION_DOWN:
                // Stop parents from handling the touch
                this.getParent().requestDisallowInterceptTouchEvent(true);
                break;
        }
        return super.onTouchEvent(ev);
    }
}

1 个答案:

答案 0 :(得分:1)

处理事件的调用序列有点按此顺序: onInterceptTouchEvent,onDispatchTouchEvent,dispatchTouchEvent,onTouchEvent。 对我来说,这表明onTouchEvent是处理事件的最后一步。操纵哪里和哪里都为时已晚谁在最后一步处理事件。如果你看一下处理事件的早期方法,源代码会说什么?