Android 开发艺术探索笔记-View的事件分发

用户的一次点击操作为一个事件序列,包括ACTION_DOWN按下,ACTION_MOVE移动,ACTION_UP抬起


事件的分发由三个函数完成

dispatchTouchEvent()

用于事件的分发,将事件分发到下层View

onInterceptTouchEvent()

在dispatchTouchEvent中调用,决定是否拦截事件,是ViewGroup的方法,因为View是没有子视图的

onTouchEvent()

负责事件的处理


当一个触摸事件产生时,会先到Activity,再到Window,然后是Window的顶层view

一个View决定拦截事件,即onInterceptTouchEvent中返回true时,会交由onTouchEvent开始处理事件


1,当view一旦决定拦截事件,那么后续的事件都将交由它处理,即不会再调用onInterceptTouchEvent方法,而是直接调用onTouchEvent

boss把一个任务分发下来,一个程序员A说我来接受任务,那么后续的事情都将交由这个人来处理


2,当view无法处理事件,即onTouchEvent返回false时


1,如果事件为ACTION_DOWN,那么后续事件将不再交由它处理,并向上层view传递,调用父view的onTouchEvent,如果父view处理了事件返回true,那么后续的事件会直接交由父View处理。

程序员A向领导接受了任务,但是任务书到手时(ACTION_DOWN),才发现自己没有能力完成这个任务,于是向上一级领导B请求帮助,领导B能解决,那么后面的事项就给领导B来处理,领导一看任务书“哎呀,我也没办法,我再看看我的上级C是不是能处理”,于是一级一级传上去,直到有领导可以接手


2,如果不为ACTION_DOWN,那么后续事件仍然会传递到这边,并且会调用Activity中的onTouchEvent方法

A已经在处理这个任务了,中途发现一些事情(ACTION_MOVE,ACTION_UP)没法处理,但是已经做到一半了,没办法,只能继续做下去了,并且向boss反馈问题




ACTION_DOWN事件沿着View树分发下去,一旦某个view的dispatchTouchEvent返回了true,则确定了后续事件分发的路径

确定之后如果要修改这条路径,则需要其中某个view的onInterceptTouchEvent返回true拦截事件,这时候路径从这个view开始截断


如ACTION_DOWN分发之后路径为A->B->C,继续滑动收到ACTION_MOVE,如果某个时刻B的onIntercepTouchEvent返回了true,这时候路径从B打断,C收到ACTION_CANCEL事件,路径变为A->B,之后的ACTION_MOVE,ACTION_UP事件都不会到达C的dispatchTouchEvent





你可能感兴趣的:(Android笔记)