android事件分发机制

来源:互联网 发布:linux基础试题 编辑:程序博客网 时间:2024/05/29 10:26

        这是我的第一个博客,同时也作为一个安卓程序员,希望自己能够坚持下去学习,成长。


        而且因为View是树形结构,在多层重叠的,当点击到多层重叠的View上面时,就需要事件分发机制。

                                                    

          而从中可以得到一个View结构:

                         

        而从这里,可以发现,我们每次触摸屏幕时,事件是从PhoneWindow传递下来的。

        PhoneWindow是继承自Window,一个抽象类,而PhoneWindow则是Window类的唯一实现类。Window类是所有视图最顶层的容器,管理视图的外观和行为。

       而DecorView是PhoneWindw的一个内部类,作用是负责消息的传递。

       事件的分发、拦截与消费

     

     


      

          事件分发流程:

          Activity -> PhoneWindow -> DecorView -> ViewGroup -> View

         如果对事件没有处理,则回传。

         View -> ViewGroup -> DecorView -> PhoneWindow -> Activity

         注意:事件分发机制中,如果View没有处理事件,则给父View返回一个false值,父View则根据返回值来调用自身的onTouchEvent。

         ViewGroup是根据onInterceptTouchEvent返回值来确定调用子View的dispaTouchEvent还是自身的onTouchEvent,并没有将调用交给onInterceptTouchEvent。

         事件被消费掉则意味着消息传递的结束。上层不再处理。


        触摸事件

        每次点击、长按、移动都是一个事件,这些事件被封装成MotionEvent。

        有四种事件:ACTION_DOWN:         手指初次接触到屏幕时触发。

                              ACTION_MOVE:         手指在屏幕上滑动时触发。

                              ACTION_UP:               手指离开屏幕时触发。

                              ACTION_CANCEL:     事件被上层拦截时触发。

        对于一般流程:

        手指落下(ACTION_DOWN) ——> 移动(ACTION_MOVE)——>离开(ACTION_UP)

        对于单次点击,只有ACTION_DOWN ——> ACTION_UP




        参考自:http://www.gcssloop.com/customview/dispatch-toucheve

                      http://www.gcssloop.com/customview/dispatch-touchevent-sourcent-theory

               

  

       

       

                                            

    

原创粉丝点击