版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安徽中澳科技职业学院《资本论选读》2025-2026学年期末试卷
- 2026年牡丹江市爱民区社区工作者招聘考试参考试题及答案解析
- 福建农林大学《涉外礼仪》2025-2026学年期末试卷
- 安徽林业职业技术学院《经济学原理》2025-2026学年期末试卷
- 2026年浙江省杭州市社区工作者招聘考试备考题库及答案解析
- 2026年新疆维吾尔自治区乌鲁木齐市社区工作者招聘考试参考题库及答案解析
- 2026年昆明市西山区社区工作者招聘笔试备考试题及答案解析
- 2026年葫芦岛市南票区社区工作者招聘考试备考题库及答案解析
- 2026年医养结合型养老院规章制度大(3篇)
- 2026年营口市老边区社区工作者招聘笔试模拟试题及答案解析
- 行为规范教育:文明礼仪从我做起小学主题班会课件
- 2025年全国计算机一级WPSOffice考试模拟试题及答案
- 人教版高二下学期第一次月考化学试卷(带答案与解析)
- 《化工和危险化学品生产经营企业重大生产安全事故隐患判定准则》AQ3067-2026培训
- 药液外渗工作制度
- GB/T 2297-2025太阳光伏能源系统术语
- 2026北森测评试题及答案
- 华为公司管理制度规范
- 2025年重庆辅警笔试及答案
- 广安市四川广安区恒升镇人民政府选用1名片区纪检监督员笔试历年参考题库典型考点附带答案详解(3卷合一)试卷2套
- 三维网植草护坡技术方案与施工流程
评论
0/150
提交评论