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