版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】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年商务礼仪类试题商务谈判与合同签订技巧
- 2026年新闻采编实务操作模拟题含新闻写作技巧
- 2026年税务筹划与税收政策分析模拟题
- 2026年市场营销策略案例分析训练题及答案
- 2026年钢琴演奏等级考试模拟题及评分标准
- 2026年律师实务案例分析能力测试题库
- 2026年航空航天技术及空间探索知识题
- 2026年财务成本控制与预算管理试题集及解析
- 2026年商业策划师招聘测试题集商业战略规划与执行
- 建筑结构健康监测技术方案
- 国家电网有限公司输变电工程通 用设计(330~750kV输电线路绝缘子金具串通 用设计分册)2024版
- 欠债抵房屋协议合同
- TSG R0004-2025固定式压力容器安全技术监察规程
- 大学劳动教育(第二版)课件 第二章 劳动价值观与劳动素养
- DBJ50T-240-2016 蒸压加气混凝土精确砌块自承重墙体工程应用技术规程
- 重难点08滑块-滑板模型专题高一物理题组法突破重难点(原卷版)
- 2024铁路营业线作业人员北斗安全预警防护系统技术条件
- 《东北解放区工业戏剧研究(1945-1949年)》
- 新版中国食物成分表
- 外研版七年级英语上册电子版课文-七上外研版英语电子书
评论
0/150
提交评论