网站视图错位,微信小程序个人中心制作,汕头关键词优化平台,wordpress编辑器增加#来自ウルトラマンゼロ#xff08;哉阿斯#xff09; 1 Activity 构成 平常布局展示在ContentView中。
2 事件分发 事件分发的本质其实就是把事件#xff08;Touch#xff09;封装成 MotionEvent 类#xff0c;然后传递给 View 的层级处理。
MotionEvent 事件类型主要有…#来自ウルトラマンゼロ哉阿斯 1 Activity 构成 平常布局展示在ContentView中。
2 事件分发 事件分发的本质其实就是把事件Touch封装成 MotionEvent 类然后传递给 View 的层级处理。
MotionEvent 事件类型主要有下面四种
MotionEvent.ACTION_DOWN按下事件事件开始MotionEvent.ACTION_UP抬起事件与 DOWN 对应MotionEvent.ACTION_MOVE移动事件MotionEvent.ACTION_CANCEL结束事件
事件分发由三个方法协作完成
dispatchTouchEvent()事件分发onTouchEvent()消费事件、在 dispatchTouchEvent() 中调用onInterceptTouchEvent()拦截事件、只有 ViewGroup 有、在 dispatchTouchEvent() 中调用
3 dispatchTouchEvent() 主要是负责分发是安卓事件分发过程中的核心。
返回 TRUE则表明对事件已经处理不用继续调用其余组件的分发方法即停止分发。返回 FALSE则表明对事件不能处理需要按照规则继续分发事件在不复写该方法的情况下除了一些特殊的组件其余组件都是默认返回 False。
3.1 Activity#dispatchTouchEvent() 可以用以下伪代码说明
public boolean dispatchTouchEvent(MotionEvent ev) {if (child.dispatchTouchEvent(ev)) {return true;//子 View 消费事件,返回 TRUE让调用者知道该事件已被消费} else {return onTouchEvent(ev);//子 View 没有消费事件调用自身的 onTouchEvent}
}
事件经过传递后事件被消费了返回 TRUE则 Activity 的分发方法也返回 TRUE表示该事件已经被消费了。事件经过传递后事件没有被消费返回 FALSE则 Activity 调用 onTouchEvent() 去处理。onTouchEvent 消费事件返回 TRUE表示已消费事件并作为 dispatchTouchEvent() 的返回值让调用它的对象知道 Activity 消费事件。onTouchEvent 没有消费事件返回 FALSE表示未消费事件并作为 dispatchTouchEvent() 的返回值。让调用它的对象知道该 Activity 没有消费事件需要继续处理。
3.2 ViewGroup#dispatchTouchEvent() public boolean dispatchTouchEvent(MotionEvent ev) {if (!onInterceptTouchEvent(ev)) {return child.dispatchTouchEvent(ev);//不拦截则传给子 View 进行分发处理} else {return onTouchEvent(ev);//拦截事件交由自身 onTouchEvent 方法处理}
}
返回 FALSE不拦截则交给子 View 去调用 dispatchTouchEvent() 方法返回 TRUE拦截则调用 ViewGroup 对象 onTouchEvent(ev) 方法处理。
3.3 View#dispatchTouchEvent() public boolean dispatchTouchEvent(MotionEvent ev) {//listener 不为空调用 onTouch方法if (mOnTouchListener ! null mOnTouchListener.onTouch(this, event)) {return true;//若onTouch方法返回TRUE消费事件则 dispachtouTouchEvent返回 TRUE让其调用者知道该事件已被消费可见 setOnTouchListener 优先级比较高。}return onTouchEvent(ev);//没有消费事件则调用对象自身的 onTouchEvent() 处理。
}
onTouch() 返回 TRUE则 dispatchTouchEvent 也会返回TRUE表示消费该事件。onTouch() 返回 FALSE或者 mOnTouchListener 为空调用自身的 onTouchEvent() 处理是否消费事件可以由其返回值判断。
4 onInterceptTouchEvent 该方法是 ViewGroup 独有的对事件进行提前拦截。一般情况下该方法是默认返回 FALSE表示不拦截。 如果自定义 ViewGroup 希望拦截事件不希望事件传递可以覆写该方法返回 TRUE即可阻止向下的传播过程。
子 View 也可以通过 requestDisallowInterceptTouchEvent 来设置 FLAG_DISALLOW_INTERCEPT 标志位禁止 ViewGroup 拦截除了 DOWN 之外的事件。 返回 TRUE则会将事件拦截自身的 onTouchEvent 处理。 返回 FALSE则继续传递给子 View 执行分发流程。
5 onTouchEvent 对事件进行处理。
返回 TRUE 表示已经处理了事件返回 FALSE 表示没有对事件进行处理需要继续传递事件。一般情况下默认为 FALSE。在 View 的onTouchEvent 方法中如果设置了 setOnClickListenter、setOnLongClickListene 处理返回 TRUE。
6 总结 当事件产生之后传递顺序Activity - PhoneWindow - 顶层 ViewGroup事件传递中一般考虑 ViewGroup 的 onInterceptTouchEvent()一般情况下我们不会重写 dispatchTouchEvent()。对于根 ViewGroup事件首先传递到 dispatchTouchEvent(): onInterceptTouchEvent() - TRUE则表示拦截事件这个事件就由 onTouchEvent()onInterceptTouchEvent() - FALSE则表示不拦截事件这个事件会交给它的子 View dispatchTouchEvent()如果事件传递到底层的 ViewView 是没有子View的就会调用 View 的 dispatchTouchEvent()通常情况下会调用 View 的 onTouchEvent() 处理事件。