android面试-事件分发
回答思路:首先事件是哪几个事件,视图的结构,事件分发的整个流程事件类型:首先事件分为按下、移动、抬起,还有一个cancel,非人为的结束视图结构:首先得有个结构模型概念:ViewGroup和View组成了一棵树形结构,最顶层为Activity的ViewGroup,其中ViewGroup是View的子类,又是View的容器,ViewGroup中可以存放View
·
回答思路:
首先事件是哪几个事件,视图的结构,事件分发的整个流程
事件类型:
首先事件分为按下、移动、抬起,还有一个cancel,非人为的结束
视图结构:
首先得有个结构模型概念:ViewGroup和View组成了一棵树形结构,最顶层为Activity的ViewGroup,其中ViewGroup是View的子类,又是View的容器,ViewGroup中可以存放View或者ViewGroup。
事件的分发:
上图理解好Activity-ViewGroup-View这个过程的分发,最好是看一下源码,就一些逻辑的处理,在对比下上图,很容易就理解整个流程。
ViewGroup的dispatchTouchEvent是真正在执行“分发”工作,而View的dispatchTouchEvent方法,并不执行分发工作,或者说它分发的对象就是自己,决定是否把touch事件交给自己处理,而处理的方法,便是onTouchEvent事件,事实上子View的dispatchTouchEvent方法真正执行的代码是这样的
ViewGroup的onTouchEvent事件是什么时候处理的呢?当ViewGroup所有的子View都返回false时,onTouchEvent事件便会执行。由于ViewGroup是继承于View的,它其实也是通过调用View的dispatchTouchEvent方法来执行onTouchEvent事件。
在目前的情况看来,似乎只要我们把所有的onTouchEvent都返回false,就能保证所有的子控件都响应本次Touch事件了。但必须要说明的是,这里的Touch事件,只限于Acition_Down事件,即触摸按下事件,而Aciton_UP和Action_MOVE却不会执行。事实上,一次完整的Touch事件,应该是由一个Down、一个Up和若干个Move组成的。Down方式通过dispatchTouchEvent分发,分发的目的是为了找到真正需要处理完整Touch请求的View。当某个View或者ViewGroup的onTouchEvent事件返回true时,便表示它是真正要处理这次请求的View,之后的Aciton_UP和Action_MOVE将由它处理。当所有子View的onTouchEvent都返回false时,这次的Touch请求就由根ViewGroup,即Activity自己处理了。
更多推荐
已为社区贡献1条内容
所有评论(0)