Because if I don’t write it down, I’ll forget it

前言:欢迎大家给我指出错误,一起进步。谢谢,也希望大家能认真看。

如果没有看Activity、View、Window之间关系的朋友,推荐先看一下,因为清楚了Activity与View之间的关系,对于触摸事件的传递理解起来也更容易!Activity、View、Window之间关系:

关于Touch 时间的分发响应文章有很多了,但是自己理一遍的印象 要比看别人的深刻,这里自己记一下,也便与以后回过头来翻!

Touch 事件 对于 新手来说,是很困扰的,因为事件之间的传递过程,我们还不理解,去翻看代码,翻着 翻着,反而越发不清晰,这里 我跟大伙一起理一下传递机制。

首先 ,一点大家需要知道 所谓的 Touch事件包含的几个动作:

MotionEvent.ACTION_DOWN :手指按下

MotionEvent.ACTION_UP :手指离开屏幕

MotionEvent.ACTION_MOVE :手指在屏幕上滑动

有几个方法:

要了解事件分发过程,肯定是从手机触摸到屏幕这个动作发起的,所以 最先开始的肯定是ACTION_DOWN 这个动作的捕获。捕获这个动作后,再去传递给要消费该动作的具体View。

那就从简单地Demo开始了解一下View的触摸事件,这里比较基础,如果你对触摸比较了解,可以跳过。

我们定义一个RelativeLayout 包裹一个ImageView 的简单布局:

图一

我们实现Activity的dispatchTouchEvent(MotionEvent ev)和onTouchEvent(MotionEvent event)这两个分方法。

ImageView的dispatchTouchEvent(MotionEvent event)、onTouchEvent(MotionEvent event)以及实现setOnTouchListener

、setOnClickListener两个监听事件。

RelativeLayout的dispatchTouchEvent(MotionEvent ev)、onInterceptTouchEvent(MotionEvent ev)和onTouchEvent(MotionEvent event)这三个方法,同时监听RelativeLayout的setOnTouchListener、setOnClickListener事件。

将程序运行到手机上,我们先点击一下图片以外的地方,看一下打印的Log信息:

点击布局10-29 11:40:24.509: E/MainActivity(29973): dispatchTouchEvent:————–MainActivity 10-29 11:40:24.519: E/TouchRelativeLayout(29973): MotionEvent.ACTION_DOWN————–dispatchTouchEvent10-29 11:40:24.519: E/TouchRelativeLayout(29973): onInterceptTouchEvent10-29 11:40:24.519: E/TouchRelativeLayout(29973): onInterceptTouchEvent: false10-29 11:40:24.519: E/TouchRelativeLayout(29973): MotionEvent.ACTION_DOWN————–onTouch10-29 11:40:24.519: E/TouchRelativeLayout(29973): MotionEvent.ACTION_DOWN————–onTouchEvent10-29 11:40:24.519: E/TouchRelativeLayout(29973): super.onTouchEvent(event) :true10-29 11:40:24.519: E/TouchRelativeLayout(29973): super.dispatchTouchEvent(event) :true10-29 11:40:24.519: E/MainActivity(29973): dispatchTouchEvent:————–MainActivity :true抬手10-29 11:40:30.649: E/MainActivity(29973): dispatchTouchEvent:————–MainActivity 10-29 11:40:30.649: E/TouchRelativeLayout(29973): MotionEvent.ACTION_UP————–dispatchTouchEvent10-29 11:40:30.649: E/TouchRelativeLayout(29973): MotionEvent.ACTION_UP————–onTouch10-29 11:40:30.649: E/TouchRelativeLayout(29973): MotionEvent.ACTION_UP————–onTouchEvent10-29 11:40:30.649: E/TouchRelativeLayout(29973): super.onTouchEvent(event) :true10-29 11:40:30.649: E/TouchRelativeLayout(29973): super.dispatchTouchEvent(event) :true10-29 11:40:30.649: E/MainActivity(29973): dispatchTouchEvent:————–MainActivity :true10-29 11:40:30.649: E/TouchRelativeLayout(29973): OnClickListener————– 我们分析一下,传递流程,首先 Activity 的 dispatchTouchEvent 方法手机按下这一事件给RelativeLayout布局,RelativeLayout这个布局判断是否要拦截该事件的传递,false 不拦截,由于点击的是ImageView 以外的部分,所以该事件传递到RelativeLayout布局上面,就已经找到了targetView,OK,接下来RelativeLayout处理掉这个按下的动作(响应了onTouch和onTouchEvent),并且RelativeLayout的dispatchTouchEvent方法返回true,方法结束,通知Activity 的dispatchTouchEvent方法 ,OK,事件已经被消费掉了,这个按下的动作就响应完了。往事是尘封在记忆中的梦,而你是我唯一鲜明的记忆,

Because if I don’t write it down, I’ll forget it

相关文章:

你感兴趣的文章:

标签云: