您的位置:首页 > 产品设计 > UI/UE

android事件之onInterceptTouchEvent,dispatchTouchEvent,onTouchEvent,requestDisallowInterceptTouchEvent

2015-08-07 17:55 465 查看
android 的这个事件的分发传递,处理的解决方式,

实质应该是 java设计模式里面的 责任链模式了。

在这里,想用最少的话,最通俗易懂的方式记录

View的方法

[code]// 事件分发,默认返回false 
public boolean dispatchTouchEvent(MotionEvent event) 

// 事件处理,默认返回false 
public boolean onTouchEvent(MotionEvent event)


ViewGroup的方法

[code]// 事件分发,默认返回false 
public boolean dispatchTouchEvent(MotionEvent event) 

// 事件处理,默认返回false 
public boolean onTouchEvent(MotionEvent event) 

// 拦截默认,默认返回false
// 返回true 就不会往下传递事件,自己onTouchEvent处理
// 返回false 向下传递事件
public boolean onInterceptTouchEvent(MotionEvent ev)


当触发一个事件,父布局会优先得到这个事件进行分发,也就是一般的

单独View (如果设置了OnTouchListener)

dispatchEvent–setOnTouchListener–onTouchEvent

单独看ViewGroup (如果设置了OnTouchListener)

dispatchTouchEvent –onInterceptTouchEvent–setOnTouchListener– onTouchEvent

3.ViewGroup 嵌套View

也就是我们平常最有用最关心的

前面说了底层的View能够接收到这次的事件有一个前提条件:在父层级允许的情况下。假设不改变父层级的dispatch方法,在系统调用底层onTouchEvent之前会先调用父View的onInterceptTouchEvent方法判断,父层View是不是要截获本次touch事件之后的action。

所以下面的这个东西一定要分清楚,这个还是很重要的,很多人很模糊,或者说很ran

事件的分发上的执行顺序:

(父)dispatchTouchEvent



(父)onInterceptTouchEvent



(子)dispatchEvent

事件的处理执行顺序

(子)onTouchEvent



(父)onTouchEvent

4 如果父View 和 子View都设置的点击事件相应的问题了

其实是都可以响应的,不多说,ListView中的adapter item布局都写的多了。

5 requestDisallowInterceptTouchEvent

requestDisallowInterceptTouchEvent 是ViewGroup类中的一个公用方法

Called when a child does not want this parent and its ancestors to intercept touch events with ViewGroup.onInterceptTouchEvent(MotionEvent).

This parent should pass this call onto its parents. This parent must obey this request for the duration of the touch (that is, only clear the flag after this parent has received an up or a cancel.

实际的应用中,可以在子view的ontouch事件中注入父ViewGroup的实例,并调用requestDisallowInterceptTouchEvent去阻止父view拦截点击事件

原来listView 第一行, 嵌套ViewPager ,其他行嵌套别的中就需要用到这个

需要在子布局中操作,父布局不拦截自身事件

[code]@Override
    public boolean dispatchTouchEvent(MotionEvent ev) {

        //让父类不拦截触摸事件就可以了。
        this.getParent().requestDisallowInterceptTouchEvent(true); 
        return super.dispatchTouchEvent(ev);

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: