美文网首页
Touch事件分发

Touch事件分发

作者: Cheep | 来源:发表于2018-12-21 14:59 被阅读0次

    Ø 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界面


    image
    下面我通过几种情况来说明Touch事件分发
    1)dispatchTounchEvent()作用分析
    情况<1>:在ParentLayout 布局
         dispatchTouchEvent()    return false;
         onInterceptTouchEvent()   return true;
         onTouchEvent()  return true;
    
    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;
    
    image
    image
     解释:通过log可以看得出,在父控件中dispatchTouchEvent()  return false;在父类ACTION_DOWN本次操作之后,后面的操作多无效。
          而子类同样在ACTION_DOWN本次操作之后,后面的操作多无效。由此我们可以联想得出事件多是都是从父类传递过来的。
    

    相关文章

      网友评论

          本文标题:Touch事件分发

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