android ontouch事件传递分析与指南

本文详细解析了Android中触摸事件的传递与处理机制,包括事件如何从父控件传递到子控件,以及如何根据onInterceptTouchEvent和onTouchEvent方法中的逻辑决定事件的最终处理者。

本文暂不考虑事件分发(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有关;





评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值