您的位置:首页 > 移动开发 > Android开发

android ontouch事件传递分析与指南

2013-08-23 18:11 447 查看
本文暂不考虑事件分发(dispatchTouchEvent)



讨论此事情一定要明白两件事,一是 事件的传递, 二是 事件的处理;

首先设置下 情景:



如上图:子控件没有完全覆盖父控件

一、当点击 上图 蓝色部分的时候,只响应父控件的一些相关事件,没有事件传递事件。

二、当点击 橘黄色部分的时候 ,则正是我们要讲的事件传递与处理的事件;

( 1 ) 事件传递

首先要明白事件的传递是从 父控件向子控件 逐级传递的。那么这种情况下就要看各个控件的onInterceptTouchEvent拦截事件了。

如果在onInterceptTouchEvent 中,相应的事件(down,move,up) 的返回值为true,表示 该控件 拦截了相应的事件,那么

这个事件就不能传递到子控件,这时他就会执行 该控件 里的onTouchEvent里的相关事件;

( 2 ) 事件处理

要知道事件的响应是从子控件到父控件 逐级传递的。 也就是说,当事件已经传递到了子控件(其父控件并没有拦截,父控件onInterceptTouchEvent中return false)

所以,我们应该从子控件分析入手:

按照上面所说,down事件没有被父控件拦截

如下:父控件中的onInterceptTouchEvent事件

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
{
System.out.println("parent_intercept_down:"+1111111);
break;
}
case MotionEvent.ACTION_MOVE:
{
System.out.println("parent_intercept_move:"+1111111);
break;
}
case MotionEvent.ACTION_UP:
{
System.out.println("parent_intercept_up:"+1111111);
break;
}

default:
break;
}
return false;
}


则事件就传递到了子控件

现在在看看 事件处理 机制:

首先看子控件的 onTouchEvent 的down事件,这个事件的返回值很重要

! ) 如果返回值为true

这表示该子控件的down事件消耗过,也就是说系统已经知道他执行过,这时候他才会执行子控件中的move 和 up事件,那move 和 up事件还是重复刚才down事件的动作, 从 父控件onInterceptTouchEvent拦截事件 开始来判断是否拦截,然后子控件的move,up事件响应。原理同down事件;

!! ) 如果返回值为false

这表示该子控件的down事件没有消耗过,也就是说系统不知道他执行过,那么后面的子控件的move 和 up事件就不能执行了。

这时候 down事件的处理 就会接着传递到 父控件的ononTouchEvent 事件中处理,响应的move和up事件也就只能在父控件中执行了(相关分析与子控件中的down事件一样)

总结:

事件传递只与onInterceptTouchEvent事件有关,事件处理与ononTouchEvent 的各事件返回值false或者是true有关;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: