美文网首页
Android 触摸事件传递机制(二)

Android 触摸事件传递机制(二)

作者: BlingBest | 来源:发表于2018-12-25 16:05 被阅读41次

View的事件传递机制


       虽然ViewGroup是View的子类,但这个所说的View专指除ViewGroup外的View控件,例如TextView,Button等,View控件本身已经是最小的单位,不能再作为其他View的容器。View控件拥有dispatchTouchEvent和onTouchEvent 两个方法。

        不同的返回值会导致事件传递流程相差甚远,通过不断修改这些方法的返回值并查看日志记录,我们最终可以得到屏幕按下操作ACTION_DOWN事件的处理流程

流程图

从上面的流程图可以得出以下结论:

1 触摸事件的传递流程是从dispatchTouchEvent开始的,如果不进行认为干预(也就是默认返回父类的同名函数),则事件将会依照嵌套层次从外层向内层传递,到达最内层的View时,就由它的onTouchEvent方法处理,该方法如果能够消费该事件,则返回true,如果处理不了,则返回false,这时事件会重新向外层传递,并由外层View的onTouchEvent方法进行处理,依此类推。

2 如果事件在向内层传递过程中由于认为干预,事件处理函数返回true,则会导致事件提前被消费掉,内层View将不会收到这个事件。

3 View控件的事件触发顺序是先执行onTouch方法,在最后才执行onClick方法,如果onTouch返回true,则事件不会继续传递,最后也不会调用onClick,如果onTouch返回false,则事件继续传递

ViewGroup的事件传递机制


         ViewGroup是作为View控件的容器存在的,Android系统默认提供了一系列ViewGroup的子类,常见的有LinearLayout,RelativeLayout等,ViewGroup拥有dispatchTouchEvent,onInterceptTouchEvent和onTouchEvent三个方法,可以看出和View的唯一区别是多了一个onInterceptTouchEvent方法。

流程图

从上面的流程图我们可以得出以下结论:

1  触摸事件的传递顺序是由Activity到ViewGroup,再由ViewGroup递归传递给它的子View

2 ViewGroup通过onInterceptTouchEvent方法对事件进行拦截,如果该方法返回true,则事件不会继续传递给子View,如果返回false或者super.onInterceptTouchEvent,则事件会继续传递给子View。

3 在子View中对事件进行消费后,ViewGroup将接收不到任何事件

相关文章

网友评论

      本文标题:Android 触摸事件传递机制(二)

      本文链接:https://www.haomeiwen.com/subject/wvjflqtx.html