Android笔记(十五):事件传递机制+实例分析

事件传递中三个主要方法:

    △dispathTouchEvent 分发事件

         return true    表示该方法View内部消化掉了所有事件

         return false   表示事件在本层不再继续进行分发,并交由上层控件的onTouchEvent()进行消费

         return super.dispathTouchEvent     表示事件发送给本层的onInterceptTouchEvent

        如果单纯返回true或false而不去执行super.dispathTouchEvent的话,将不会调用到同层级的onInterceptTouchEvent和onTouchEvent还有onTouch

    onInterceptTouchEvent  拦截事件(ViewGroup才有该方法)

        return true    表示拦截事件,并交由本层的onTouchEvent()进行消费

        return false/super.onInterceptTouchEvent    表示不拦截事件,发送给下层的dispathTouchEvent

    △onTouchEvent   消费事件

        return true    表示该事件被本控件消费了,事件传递结束

        return false   表示事件没有被消费,交由上层控件的onTouchEvent()进行消费

        View中super.onTouchEvent返回true;ViewGroup中super.onTouchEvent返回false

传递原则:

    1.如果在某个层级(指某个控件及其子控件)没有处理ACTION_DOWN事件,则该层就再也收不到后续的Touch事件(ACTION_MOVE、ACTION_UP、ACTION_CANCEL),直到下一次ACTION_DOWN事件到来。

    2.如果一个非ACTION_DOWN事件被父View拦截了,则那些上次处理了ACTION_DOWN的子View会收到一个ACTION_CANCEL,之后不会收到任何Touch事件,即使父View不再拦截后续的Touch。

    3.如果父View决定处理Touch事件或子View没有处理Touch事件,则父View按照普通View的处理方式消费Touch事件,否则它不处理Touch,只负责分发。

    4.如果父View在onInterceptTouchEvent中拦截了事件,则onInterceptTouchEvent中不会再收到Touch事件,而是直接交由它的onTouchEvent进行消费。

    5.如果事件传递到某一层的子View的onTouchEvent上了,这个方法返回false,那么这个事件会从这个View往上传递,都是由onTouchEvent来接收,直到传给Activity的onTouchEvent方法为止。

实例图:


其中的MyTextView实现onTouchListener和onClickListener


补充事件与点击的关系:

ACTION_DOWN->onLongClick->ACTION_UP->onClick(onLongClick返回false还会调用onClick,反之不会)

猜你喜欢

转载自blog.csdn.net/weixin_40855673/article/details/80632232