ViewGroup的touch事件总结

  1. 每次touch动作都是先ACTION_DOWN然后ACTION_MOVE(可选)最后ACTION_UP,touch动作出发后首先activity接收到动作,然后从view的底层到上层进行dispatchTouchEvent递归传递,传递到最顶层的view后开始由上到下的进行onTouch和TouchEvent调用,下面touch的三个动作顺序分别对其进行说明
  2. ACTION_DOWN
    1. 首先清空了状态即将FirstTouchTarget=null,这个很好理解,因为ACTION_DOWN代表新的一套动作开始,势必要将之前的状态清空
    2. 通过判断intercept和cancle绝对是否执行dispatchTransformedTouchEvent递归,开始递归后由下到上顺序执行child的dispatchTouchEvent
    3. child执行dispatchTouchEvent期间返回true则view的FirstTouchTarget!=null,否则FirstTouchTarget==null,注意是view的FirstTouchTarget而不是child的,当viewgroup没有child或者当前为view时,递归结束,最后一个参与递归的FirstTouchTarget=null,直接执行view.dispatchTouchEvent
    4. 递归到最底层结束之后,开始继续向上执行。子view的dispatchTouchEvent返回true的,FirstTouchTarget!=null alreadyDispatchedToNewTouchTarget && target == newTouchTarget
      由于上面的条件成立,所以不会执行动作,直接结束,这就是所谓的返回true消费了事件
      返回false的,FirstTouchTargetr==null,执行view的dispatchTouchEvent,即子view没有消费事件,事件传递到了父view
    5. 至此ACTION_DOWN结束,结果就是执行了touch时间的view FirstTouchTargetr==null,没有执行的FirstTouchTargetr!=null,FirstTouchTargetr这个字段很重要,后面的两个动作会用到
  3. ACTION_MOVE、ACTION_UP
    1. 这所以把这两个动作放到一起,是因为他俩比较类似
    2. 首先判断FirstTouchTarget是否为null,intercept、以及child返回true或者false对这两个动作都没有影响,只看FirseTouchTatget是否为null
    3. FirstTouchTarget为null,执行view的dispatchTouchEvent,结束
    4. FirstTouchTarget不为null,继续开始dispatchTransformedTouchEvent的child递归,直到遇到FirstTouchTarget==null的childview。结束
  4. 总结
    1. 子view的dispatchTouchEvent返回true,父view的FirstTouchTarget不为空,父view不执行ACTION_DOWN的dispatchTouchEvent 事件,执行ACTION_MOVE和ACTION_UP的dispatchTouchEvent
    2. 子view的dispatchTouchEvent返回false,父view的FirstTouchTarget为空,父view执行ACTION_DOWN的dispatchTouchEvent 事件,不执行ACTION_MOVE和ACTION_UP的dispatchTouchEvent
    3. intercept通过ACTION_DOWN时拦截阻止传递到子view,子view的dispatchTouchEvent 返回true将父view的FirstTouchTatget不为空阻止父View执行dispatchTouchEvent,使得ACTION_DOWN不向下传递
    4. 通过intercept和dispatchTouchEvent返回值来控制touch事件
    5. ACTION_DOWN可以传递至多个view执行,ACITON_MOVE和ACTION_UP只能一个view执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值