ViewGroup事件分发机制

方法1:

public boolean dispatchTouchEvent(MotionEvent ev)

    该方法用来进行事件的分发,即无论ViewGroup或者View的事件,都是从这个方法开始的。

方法2:

public boolean onInterceptTouchEvent (MotionEvent ev)

    在方法1内部调用,表示是否拦截当前事件。默认不拦截。

    如果拦截了事件,那么将不会分发给子View。

方法3:

public boolean onTouchEvent(MotionEvent ev)

    在方法1内部调用,表示是否对事件进行处理。


    以上三个方法非常重要,它们的关系可以用如下伪代码呈现:

public boolean dispatchTouchEvent(MotionEvent ev){

    boolean handle =false;

if(onInterceptTouchEvent(ev)){

        handle = onTouchEvent(ev);

}else{

        handle = child.dispatchTouchEvent(ev);

    }

return handle;

详细:

if (actionMasked == MotionEvent.ACTION_DOWN) {

    cancelAndClearTouchTargets(ev);

    resetTouchState();

}

首先这里先判断事件是否为DOWN事件,如果是,则初始化,由于一个完整的事件序列是以DOWN开始,以UP结束,所以如果是DOWN事件,那么说明是一个新的事件序列,所以需要初始化之前的状态。

mFirstTouchTarget =null;

mFirstTouchTarget 最终指向消耗事件的View,如果都不消耗,那么最后事件会交由Activity处理。

onTouch() 方法的返回值决定了 onTouchEvent() 方法要不要执行,如果 onTouch() 返回 true,则 onTouchEvent() 不会再执行,返回 false ,则 onTouchEvent() 继续执行,而 onClick() 的回调是在 onTouchEvent() 方法中调用

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 夜莺2517阅读 128,156评论 1 9
  • 版本:ios 1.2.1 亮点: 1.app角标可以实时更新天气温度或选择空气质量,建议处女座就不要选了,不然老想...
    我就是沉沉阅读 7,451评论 1 6
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,835评论 28 54
  • 兔子虽然是枚小硕 但学校的硕士四人寝不够 就被分到了博士楼里 两人一间 在学校的最西边 靠山 兔子的室友身体不好 ...
    待业的兔子阅读 2,767评论 2 9

友情链接更多精彩内容