【移动应用开发技术】Android事件流程详解_第1页
【移动应用开发技术】Android事件流程详解_第2页
【移动应用开发技术】Android事件流程详解_第3页
【移动应用开发技术】Android事件流程详解_第4页
【移动应用开发技术】Android事件流程详解_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论