View的事件分发机制

View事件的分发规则

  1. public boolean dispatchTouchEvent(MotionEvent ev)
  2. public boolean onInterceptTouchEvent(MotionEvent ev)
  3. public boolean onTouchEvent(MotionEvent event)

注意:只有ViewGroup有onInterceptTouchEvent事件

1、dispatchTouchEvent

用于进行事件的分发,只要事件能传递到该View,就会执行该方法。返回结果受当前View的onTouchEvent和下级View的dispatchTouchEvent影响。

2、onInterceptTouchEvent

用于进行事件的拦截

MyLinearLayout中

return super.onInterceptTouchEvent(ev):

return true:拦截,将事件交给自己的onTouch(如果有设置过 onTouchListener的话)和onTouchEvent(如果onTouch返回true表示onTouch消耗了该事件,将不会调用onTouchEvent)来处理。
这里写图片描述

return false:不拦截,事件向下传递
同上图

3、onTouchEvent

处理点击事件
return super.onTouchEvent(ev):
不拦截touch事件
这里写图片描述

返回true:消耗当前事件,不再向下传递
过程同上图,只是没有了onclick事件

返回false:调用父容器的onTouchEvent,依此类推。如果都返回false。交给Activity处理。

这里写图片描述
这里我的MyTextView和MyLinearLayout的onTouchEvent都返回了false,所以事件就“向上传递“到了Activity

所以总结一下,View的事件分发机制的伪代码:

//父容器捕获touch事件
    public boolean dispatchTouch(MotionEvent ev) {
        boolean consume=false;
        //传递给自己的onInterceptTouchEvent
        if(this.onInterceptTouchEvent(ev)){
            //返回true,表示我要拦截该touch事件自己处理
            consume=this.onTouchEvent(ev);
            //onTouchEvent处理完之后
            if(this.onTouchEvent(ev)){
                //事件被消耗,即事件处理完了
            }else{
                //不消耗事件,向上传递给父容器
                this.parent.onTouchEvent(ev);
            }
        }else{
            //返回false表示传递给子控件处理
            consume=this.child.dispatchTouchEvent(ev);

        return consume;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值