事件分发

来源:互联网 发布:淘宝网会员费 编辑:程序博客网 时间:2024/05/30 23:36

事件分发

 

onTouchListener()调用onTouch(),

返回false,执行 onTouchEvent()

返回true,不会执行onTouchEvent(),

onTouchEvent()中执onClick

 

 

 

 

ViewGroup具有以下方法:

dispatchTouchEvent 分发

onInterceptTouchEvent 拦截

onTouchEvent 消费

 

View具有以下方法:

 

dispatchTouchEvent 分发

onTouchEvent 消费

 

 

 

 

 

dispatchTouchEvent 分发

返回 super.dispatchTouchEvent(ev) 调用自身的拦截方法

返回false                             调用上级的消费方法

返回true                               该方法消费

 

onInterceptTouchEvent 拦截

 

返回 super.dispatchTouchEvent(ev) 调用下级的分发方法

返回false                             调用下级的分发方法

返回true                               调用自身的消费方法

 

onTouchEvent 消费

 

返回 super.dispatchTouchEvent(ev) 

 

如果是view,clickabletrue,本身消费,为false,调用上级的消费方法,如果是viewGroup,调用上级的消费方法

 

返回false                             调用上机的消费方法

返回true                               本身消费

 

 

解决事件冲突:

viewGrouponInterceptTouchEvent方法进行是否事件分发给子View处理,根据需求来

 

ViewGroup如果不想让父布局拦截自己的事件,则可以通过在dispatchTouchEventDOWN事件后调用requestDisallowInterceptTouchEvent(true)来告诉父布局不要拦截我的事件

 

View如果不想让父布局拦截自己的事件,则可以通过在dispatchTouchEventDOWN事件后调用getParent().

requestDisallowInterceptTouchEvent(true)来告诉父布局不要拦截我的事件

 

实例:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {

    int action = ev.getAction();
    switch (action) {
        case MotionEvent.ACTION_DOWN:
            requestDisallowInterceptTouchEvent(true);
            break;
        case MotionEvent.ACTION_MOVE:
            return true;
        case MotionEvent.ACTION_UP:
            requestDisallowInterceptTouchEvent(false);
            break;

        default:
            break;
    }

    return super.onInterceptTouchEvent(ev);
}