Touch事件分发

Ø public boolean dispatchTouchEvent (MotionEventev)

    此方法一般用于初步处理事件,因为动作是由分发,所以通常会调用super.dispatchTouchEvent.这样就会继续调用onInterceptTouchEvent,再由onInterceptTouchEvent觉得事件的流向。

    True: 继续接受动作序列中的后续事件,如down、move、up;

    False:不接受动作序列中的后续事件,因此本次后续操作不起作用,如:down后返回false,则move和up都不会被接受,只能接受下个动作。这里    为什么特别指定的down事件呢,因为如果down返回true,说明后续事件会被传递于此,但是move返回false呢?哈哈,这个就不会影响了,因此说down才是关键

Ø public boolean onInterceptTouchEvent(MotionEvent ev)

        若返回值为True事件会传递到自己的onTouchEvent();

        若返回值为False传递到下一个view的dispatchTouchEvent();

Ø public boolean onTouchEvent(MotionEvent ev)

若返回值为True,事件由自己处理消耗,后续动作序列让其处理;

若返回值为False,自己不消耗事件了,向上返回让其他的父View的onTouchEvent接受处理;


触摸事件的分发顺序:Activity-->顶级View-->顶级View的子View-->. . .-->Target View

触摸事件的响应顺序:TargetView --> TargetView的父容器 --> . . . -->顶级View -->Activity

分为四个类:

MainActivity(Activity)、ChildLayout(LinearLayout)、ParentLayout(LinearLayout)、CustomBottom(Button)

布局层次:
MainActivity->ParentLayout->ChildLayout->CustomButtom
说明:每次点击最内层button界面


Touch事件分发_第1张图片
image
下面我通过几种情况来说明Touch事件分发
1)dispatchTounchEvent()作用分析
情况<1>:在ParentLayout 布局
     dispatchTouchEvent()    return false;
     onInterceptTouchEvent()   return true;
     onTouchEvent()  return true;
Touch事件分发_第2张图片
image
解释:当dispatchTounchEvent() return false;在ACTION_DOWN本次操作之后,后面的操作多无效。如onTouchEvent()中的
      ACTION_MOVE、ACTION_UP、ACTION_CANCEL等操作无效。(由于onInterceptTouchEvent()   return true;和onTouchEvent()
      return true;拦截事件往下传递,自己消费。所以ChildLayout、CustomButton中间没有监听到touch事件)

情况<2>:在ParentLayout 布局
    dispatchTouchEvent()  return false;
    onInterceptTounchEvent() return false;
    onTouchEvent() return false;
    ChildLayout 布局可以忽略
在CustomButton布局
    dispatchTouchEvent() return true;
    onTouchEvent() return true;
Touch事件分发_第3张图片
image

Touch事件分发_第4张图片
image
 解释:通过log可以看得出,在父控件中dispatchTouchEvent()  return false;在父类ACTION_DOWN本次操作之后,后面的操作多无效。
      而子类同样在ACTION_DOWN本次操作之后,后面的操作多无效。由此我们可以联想得出事件多是都是从父类传递过来的。

你可能感兴趣的:(Touch事件分发)