版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 文化印刷品买卖协议3篇
- 安全驾驭承诺3篇
- 方式械设备买卖合同协议书3篇
- 文了解居间合同般收费标准3篇
- 摇号定标招标文件范本编写规范3篇
- 市场调研咨询服务合同协议书3篇
- 安全饮用水订购条款3篇
- 招标文件附件格式引导3篇
- 体育场馆租赁解除合同及赔偿
- 员工满意度调查协议
- 全区国有企业资产全面清查工作方案
- 职业技能大赛-密码技术竞赛理论知识题库(附参考答案)
- 明源地产ERP管理系统
- 狼王梦-完整课件
- DB3305-T 46-2018美丽公路建设规范
- 新疆喀什地区2024届九年级下学期中考三模数学试卷(含解析)
- 高脂血症性胰腺炎的治疗与护理
- 个人推广费合同范本
- AQ/T 2061-2018 金属非金属地下矿山防治水安全技术规范(正式版)
- 个人厂房租赁合同范本简单
- 重庆地铁工程项目管理策划书
评论
0/150
提交评论