美文网首页
Android的事件分发

Android的事件分发

作者: 残非 | 来源:发表于2019-10-13 18:40 被阅读0次

    举一个工作的例子:比如公司有一个新任务,老板交给了项目经理去处理,项目经理如果自己处理,事件的传递到此就结束了,如果项目经理没有处理,可以交给手下的基层员工去处理,基层人员如果能处理,处理后事件的传递也就结束了,但是如果处理不了,直接将任务返回给项目经理,同样如果项目经理能处理,处理后事件终止,如果处理不了只能返回给老板,这时候老板必须处理这个事件了,不能继续像下传递,事件终止。

    1.什么是Android事件分发:

    Android的view是树形结构的,view可能会重叠到一起,当我们点击重叠位置的时候,会有多个view响应这个点击事件,那这个事件到底该由谁来处理,就出现Android的事件分发。

    android控件对事件处理的优先级:onTouch--->onTouchEvent--->onClick
    Android既然可以对事件进行拦截,肯定有某个方法对事件进行的传递或者分发,完成事件分发功能是由Activity的dispatchTouchEvent(MotionEvent ev)l来负责:

    2.被分发的对象

    从手触摸屏幕开始所产生一系列MotionEvent事件,将事件传递到具体的某一个View的过程就叫做事件分发


    image

    事件分发的流程

    事件分发设计到三个类,activity、viewgroup、view,三个重要 方法

    1)ViewGroup永远不会对拦截,因为他的onInterceptTouchEvent(MotionEvent ev)始终返回的是false!这样DecorView对到来的事件MotionEvent就只有分发到子View并由子View进行拦截和处理此事件了.

    2)View包括直接继承于View的子类因为其父类View没有onInterceptTouchEvent方法,所以没法对事件进行拦截,如果这种View获取到了事件,那么就会执行onTouchEvent方法(当然这也是有条件的,这个前提条件在对下面onTouch方法作用的时候会有说明)

    他们之间的关系是这样的:


    image

    Activity包括了ViewGroup,ViewGroup又可以包含多个View。


    image

    事件分发的核心方法

    dispatchTouchEvent()分发

    onTouchEvent()响应

    onInterceptTouchEvent()([ˌɪntəˈsept])拦截

    事件分发的过程

    image

    当用户点击了屏幕,事件先传递到Activity中,
    Activity通过调用自己的dispatchTouchEvent将事件分发到phoneWindow( [fəʊn]),
    phonewindow则会调用superdispatchTouchEvent方法,superdispatchTouchEvent()方法内部调用内部类DecorView( [ˈdeɪkɔː(r)] )的superdispatchTouchEvent,而DecorView又会调用dispatchTouchEvent去进行事件分发,
    如果不拦截事件,那么就会继续下传到rootview,rootview中的操作是一样的,同样在dispatchTouchEvent内部调用onInterceptTouchEvent去判断是否拦截,
    不拦截就会把事件分发给下一个viewgroup,拦截就直接在onTouchEvent返回true,viewgroup中做的判断也是一样,最后事件传递到view,
    view是最底层控件,不会有onInterceptTouchEvent,它的选择就只有处理或不处理,
    处理就在onTouchEvent进行处理并返回true,不处理的话事件也不会被销毁,会把事件回传给viewGroup,
    viewGroup也可以选择处理或不处理,处理就在onTouchEvent进行处理并返回true,不处理的话就回传给activity,如果Activity还不处理,那么这个事件才会被销毁。

    事件分发的另一个图片(个人觉得比较好理解)

    image

    相关文章

      网友评论

          本文标题:Android的事件分发

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