Ø 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本次操作之后,后面的操作多无效。由此我们可以联想得出事件多是都是从父类传递过来的。
网友评论