onInterceptTouchEvent和onTouchEvent调用时序转Word格式文档下载.docx
- 文档编号:1110232
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:13
- 大小:17.70KB
onInterceptTouchEvent和onTouchEvent调用时序转Word格式文档下载.docx
《onInterceptTouchEvent和onTouchEvent调用时序转Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《onInterceptTouchEvent和onTouchEvent调用时序转Word格式文档下载.docx(13页珍藏版)》请在冰点文库上搜索。
1.
down事件首先会传递到onInterceptTouchEvent()方法
2.
如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后returnfalse,那么后续的move,up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理。
3.
如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后returntrue,那么后续的move,up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。
4.
如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理。
5.
如果最终需要处理事件的view
的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。
下面用一个简单的实验说明上述复杂的规则。
视图自底向上共3层,其中LayoutView1和LayoutView2就是LinearLayout,
MyTextView就是TextView:
对应的xml布局文件如下:
<
?
xml
version="
1.0"
encoding="
utf-8"
>
com.touchstudy.LayoutView1
xmlns:
android="
android:
orientation="
vertical"
layout_width="
fill_parent"
layout_height="
com.touchstudy.LayoutView2
gravity="
center"
com.touchstudy.MyTextView
wrap_content"
id="
@+id/tv"
text="
AB"
textSize="
40sp"
textStyle="
bold"
background="
#FFFFFF"
textColor="
#0000FF"
/>
/com.touchstudy.LayoutView2>
/com.touchstudy.LayoutView1>
下面看具体情况:
onInterceptTouchEvent()处理down事件均返回false,onTouchEvent()处理事件均返回true
------------------------------------------------------------------------------------------------------------------------------
04-1103:
58:
42.620:
DEBUG/LayoutView1(614):
onInterceptTouchEventaction:
ACTION_DOWN
DEBUG/LayoutView2(614):
DEBUG/MyTextView(614):
onTouchEventaction:
42.800:
ACTION_MOVE
……//省略过多的ACTION_MOVE
43.130:
ACTION_UP
43.150:
这是最常见的情况,onInterceptTouchEvent并没有做任何改变事件传递时序的操作,效果上和没有覆写该方法是一样的。
可以看到,各种事件的传递本身是自底向上的,次序是:
LayoutView1->
LayoutView2->
MyTextView。
注意,在onInterceptTouchEvent均返回false时,LayoutView1和LayoutView2的onTouchEvent并不会收到事件,而是最终传递给了MyTextView。
LayoutView1的onInterceptTouchEvent()处理down事件返回true,
MyTextView的onTouchEvent()处理事件返回true
09:
27.589:
DEBUG/LayoutView1(446):
27.629:
27.689:
27.959:
从Log可以看到,由于LayoutView1在拦截第一次down事件时returntrue,所以后续的事件(包括第一次的down)将由LayoutView1本身处理,事件不再传递下去。
LayoutView1,LayoutView2的onInterceptTouchEvent()处理down事件返回false,
MyTextView的onTouchEvent()处理事件返回false
LayoutView2的onTouchEvent()处理事件返回true
----------------------------------------------------------------------------------------------------------------------------
04-1109:
50:
21.147:
DEBUG/LayoutView1(301):
DEBUG/LayoutView2(301):
DEBUG/MyTextView(301):
21.176:
21.206:
21.217:
21.486:
可以看到,由于MyTextView在onTouchEvent()中returnfalse,down事件被传递给其父view,即LayoutView2的onTouchEvent()方法处理,由于在LayoutView2的onTouchEvent()中returntrue,所以down事件传递并没有上传到LayoutView1。
注意,后续的move和up事件均被传递给LayoutView2的onTouchEvent()处理,而没有传递给MyTextView。
----------------------------------------------------------------------------------------------------------------
应大家的要求,我把源代码贴上,其实很简单,就是基础文件,主要是用来观察事件的传递。
主Activity:
InterceptTouchStudyActivity.java:
public
class
InterceptTouchStudyActivity
extends
Activity{
static
final
String
TAG
=
"
ITSActivity"
;
TextView
tv;
/**Calledwhentheactivityisfirstcreated.*/
@Override
void
onCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.layers_touch_pass_test);
}
LayoutView1.java:
LayoutView1
LinearLayout{
private
LayoutView1"
LayoutView1(Contextcontext,AttributeSetattrs){
super(context,attrs);
Log.d(TAG,TAG);
}
boolean
onInterceptTouchEvent(MotionEventev){
int
action=ev.getAction();
switch(action){
case
MotionEvent.ACTION_DOWN:
Log.d(TAG,"
onInterceptTouchEventaction:
ACTION_DOWN"
);
//
returntrue;
break;
MotionEvent.ACTION_MOVE:
ACTION_MOVE"
MotionEvent.ACTION_UP:
ACTION_UP"
MotionEvent.ACTION_CANCEL:
ACTION_CANCEL"
return
false;
onTouchEvent(MotionEventev){
onTouchEventaction:
true;
protected
onLayout(boolean
changed,
l,
t,
r,
b){
TODO
Auto-generatedmethodstub
super.onLayout(changed,l,t,r,b);
onMeasure(int
widthMeasureSpec,
heightMeasureSpec){
super.onMeasure(widthMeasureSpec,heightMeasureSpec);
LayoutView2.java:
LayoutView2
LayoutView2"
LayoutView2(Contextcontext,AttributeSetattrs){
MotionEve
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- onInterceptTouchEvent onTouchEvent 调用 时序
![提示](https://static.bingdoc.com/images/bang_tan.gif)
链接地址:https://www.bingdoc.com/p-1110232.html