版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】Android事件流程详解
Android事件流程详解
网络上有不少博客讲述了android的事件分发机制和处理流程机制,但是看过千遍,总还是觉得有些迷迷糊糊,因此特地抽出一天事件来亲测下,向像我一样的广大入门程序员详细讲述android事件背后的故事,话不多说,上干货。
android整个事件流程主要牵扯到dispatchTouchEvent(),onInterceptTouchEvent(),onTouchEvent()这三个方法,下表来说明这三个方法的功能和分布场景:
表1:
先来分析下Touch事件:所有Touch事件发生时会调用当前Activity的dispatchTouchEvent()方法来分发事件,Activity的dispatchTouchEvent()方法最终会调用PhoneWindow类中的superDispatchTouchEvent方法,最终逻辑就是该activity会调用ViewGroup类中的dispatchTouchEvent()进行隧道式分发事件(按布局元素由外向内分发),如本案例中的分发流程为TouchTraining
->
TouchViewGroup->TouchView,需要注意的是,当你在Activit中的dispatchTouchEvent()中直接返回具体的布尔值(无论是true还是false),Touch事件直接会被消费在该方法中,不会再进行下来的事件分发流程,因此必须在activity的dispatchTouchEvrent返回super.dispatchTouchEvent()来进行事件分发流程。下面进行案例说明分析:
首先在定义自己的View和ViewGroup,重写表1它们各自支持的事件流程方法,我这里自定ViewGroup继承的是LinearLayout(只要继承的是ViewGroup都一样),然后分别在Activity的布局文件中加入自定义的控件,接着在Activity中也重写它支持的事件流程方法。activity_touchtrain.xml
/geektraining/\TouchView(自定义View类)@Override
public
boolean
dispatchTouchEvent(MotionEvent
event)
{
Log.e(TAG,
"dispatchTouchEvent分发事件"+
TouchEventUtil.getTouchAction(event.getAction()));
return
super.dispatchTouchEvent(event);
}
@Override
public
boolean
onTouchEvent(MotionEvent
ev)
{
Log.e(TAG,
"onTouchEvent处理事件"+
TouchEventUtil.getTouchAction(ev.getAction()));
return
super.onTouchEvent(ev);
}TouchViewGroup(自定义ViewGroup类)@Override
public
boolean
dispatchTouchEvent(MotionEvent
ev)
{
Log.e(TAG,
"dispatchTouchEvent分发事件"
+
TouchEventUtil.getTouchAction(ev.getAction()));
return
super.dispatchTouchEvent(ev);
}
@Override
public
boolean
onInterceptTouchEvent(MotionEvent
ev)
{
Log.e(TAG,
"onInterceptTouchEvent拦截事件"+
TouchEventUtil.getTouchAction(ev.getAction()));
return
super.onInterceptTouchEvent(ev);
}
@Override
public
boolean
onTouchEvent(MotionEvent
ev)
{
Log.e(TAG,
"onTouchEvent处理事件"+
TouchEventUtil.getTouchAction(ev.getAction()));
return
super.onTouchEvent(ev);
}TouchTraining(Activity)@Override
public
boolean
dispatchTouchEvent(MotionEvent
ev)
{
Log.e(TAG,
"dispatchTouchEvent分发事件"+
TouchEventUtil.getTouchAction(ev.getAction()));
return
super.dispatchTouchEvent(ev);
}
@Override
public
boolean
onTouchEvent(MotionEvent
ev)
{
Log.e(TAG,
"onTouchEvent处理事件"+
TouchEventUtil.getTouchAction(ev.getAction()));
return
super.onTouchEvent(ev);
}TouchEventUtils(工具类,获取当前事件类型)public
static
String
getTouchAction(int
actionId)
{
String
actionName
=
"Unknow:id="
+
actionId;
switch
(actionId)
{
case
MotionEvent.ACTION_DOWN:
actionName
=
"ACTION_DOWN";
break;
case
MotionEvent.ACTION_MOVE:
actionName
=
"ACTION_MOVE";
break;
case
MotionEvent.ACTION_UP:
actionName
=
"ACTION_UP";
break;
case
MotionEvent.ACTION_CANCEL:
actionName
=
"ACTION_CANCEL";
break;
case
MotionEvent.ACTION_OUTSIDE:
actionName
=
"ACTION_OUTSIDE";
break;
}
return
actionName;
}案例分析方案1运行结果:com.training.cj.mytrainingE/TouchTraining:dispatchTouchEvent分发事件ACTION_DOWNcom.training.cj.mytrainingE/TouchViewGroup:dispatchTouchEvent分发事件ACTION_DOWNcom.training.cj.mytrainingE/TouchTraining:onTouchEvent处理事件ACTION_DOWNcom.training.cj.mytrainingE/TouchTraining:dispatchTouchEvent分发事件ACTION_UPcom.training.cj.mytrainingE/TouchTraining:onTouchEvent处理事件ACTION_UP结果分析:Touch事件开始,调用TouchTraining的dispatchTouchEvent把事件分发TouchViewGroup的dispatchTouchEvent,TouchViewGroup的dispatchTouchEvent返回false,事件停止向下传递,同时事件并没有消费,但由于该事件来自TouchTraining(Activity),所以最终返回给TouchTraining的onTouchEvent进行消费。方案2运行结果:com.training.cj.mytrainingE/TouchTraining:dispatchTouchEvent分发事件ACTION_DOWNcom.training.cj.mytrainingE/TouchViewGroup:dispatchTouchEvent分发事件ACTION_DOWNcom.training.cj.mytrainingE/TouchTraining:dispatchTouchEvent分发事件ACTION_UPcom.training.cj.mytrainingE/TouchViewGroup:dispatchTouchEvent分发事件ACTION_UP结果分析:Touch事件由TouchTraining的dispatchTouchEvent不断向TouchViewGroup分发,TouchViewGroup的dispatchTouchEvent返回true,TouchViewGroup在dispatchTouchEvent中不断消费来自TouchTraining的dispatchTouchEvent分发的事件。方案3运行结果:com.training.cj.mytrainingE/TouchTraining:dispatchTouchEvent分发事件ACTION_DOWNcom.training.cj.mytrainingE/TouchViewGroup:dispatchTouchEvent分发事件ACTION_DOWNcom.training.cj.mytrainingE/TouchViewGroup:onInterceptTouchEvent拦截事件ACTION_DOWNcom.training.cj.mytrainingE/TouchViewGroup:onTouchEvent处理事件ACTION_DOWNcom.training.cj.mytrainingE/TouchTraining:onTouchEvent处理事件ACTION_DOWNcom.training.cj.mytrainingE/TouchTraining:dispatchTouchEvent分发事件ACTION_UPcom.training.cj.mytrainingE/TouchTraining:onTouchEvent处理事件ACTION_UP结果分析:Touch事件发生,调用TouchTraining的dispatchTouchEvent分发事件到TouchViewGroup的dispatchTouchEvent,TouchViewGroup的dispatchTouchEvent返回super.onInterceptTouchEvent(ev)进行事件分发,事件向下传递给TouchViewGroup的onInterceptTouchEvent,TouchViewGroup的onInterceptTouchEvent返回true,事件被拦截并传递给TouchViewGroup的onTouchEvent进行消费,TouchViewGroup的onTouchEvent返回super.dispatchTouchEvent(ev),对Touch事件未消费并返回给上级控件的onTouchEvent进行消费,由于TouchViewGroup的Touch事件来自TouchTraining,所以最后由TouchTraining的onTouchEvent进行消费。方案4运行结果:com.training.cj.mytrainingE/TouchTraining:dispatchTouchEvent分发事件ACTION_DOWNcom.training.cj.mytrainingE/TouchViewGroup:dispatchTouchEvent分发事件ACTION_DOWNcom.training.cj.mytrainingE/TouchViewGroup:onInterceptTouchEvent拦截事件ACTION_DOWNcom.training.cj.mytrainingE/TouchView:dispatchTouchEvent分发事件ACTION_DOWNcom.training.cj.mytrainingE/TouchView:onTouchEvent处理事件ACTION_DOWNcom.training.cj.mytrainingE/TouchViewGroup:onTouchEvent处理事件ACTION_DOWNcom.training.cj.mytrainingE/TouchTraining:onTouchEvent处理事件ACTION_DOWNcom.training.cj.mytrainingE/TouchTraining:dispatchTouchEvent分发事件ACTION_UPcom.training.cj.mytrainingE/TouchTraining:onTouchEvent处理事件ACTION_UP结果分析:Touch事件发生,调用TouchTraining的dispatchTouchEvent分发事件到TouchViewGroup的dispatchTouchEvent,TouchViewGroup的dispatchTouchEvent返回super.onInterceptTouchEvent(ev),继续分发向下传递事件到TouchViewGroup的onInterceptTouchEvent,TouchViewGroup的onInterceptTouchEvent返回false,继续分发向下传递事件到TouchView的dispatchTouchEvent,TouchView的dispatchTouchEvent返回super.dispatchTouchEvent(ev),继续分发向下传递事件到TouchView的onTouchEvent,TouchView的onTouchEvent返回super.onTouchEvent(ev),事件没有消费,返回给上级TouchViewGroup的onTouchEvent进行消费,TouchViewGroup的onTouchEvent返回super.onTouchEvent(ev),继续返回给上级TouchTraining的onTouchEvent进行消费。方案5:运行结果:com.training.cj.mytrainingE/TouchTraining:dispatchTouchEvent分发事件ACTION_DOWNcom.training.cj.mytrainingE/TouchViewGroup:dispatchTouchEvent分发事件ACTION_DOWNcom.training.cj.mytrainingE/TouchViewGroup:onInterceptTouchEvent拦截事件ACTION_DOWNcom.training.cj.mytrainingE/TouchView:dispatchTouchEvent分发事件ACTION_DOWNcom.training.cj.mytrainingE/TouchView:onTouchEvent处理事件ACTION_DOWNcom.training.cj.mytrainingE/TouchTraining:dispatchTouchEvent分发事件ACTION_UPcom.training.cj.mytrainingE/TouchViewGroup:dispatchTouchEvent分发事件ACTION_UPcom.training.cj.mytrainingE/Touch
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 边城书籍介绍课件
- 辩论赛培训课件
- 车队职工安全培训课件
- 内科主治医师考试强化冲刺试题及答案
- 车队冬季四防安全培训课件
- 2026年四川低压电工理论考试题库及答案
- 酒店员工行为规范及奖惩制度
- 车间级安全培训教学课件
- (2026)院感科年度培训计划(2篇)
- 车间电气设备培训课件
- 委内瑞拉变局的背后
- 政府补偿协议书模板
- 语文-吉林省2026届高三九校11月联合模拟考
- 2025年四川省高职单招模拟试题语数外全科及答案
- 2025年江苏事业单位教师招聘体育学科专业知识考试试卷含答案
- 模拟智能交通信号灯课件
- 合肥市轨道交通集团有限公司招聘笔试题库及答案2025
- 2.3《河流与湖泊》学案(第2课时)
- 工地临建合同(标准版)
- GB/T 46275-2025中餐评价规范
- 2025至2030供水产业行业项目调研及市场前景预测评估报告
评论
0/150
提交评论