本文暂不考虑事件分发(dispatchTouchEvent)

Android onTouch 方向 安卓ontouch_控件

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

首先设置下 情景:



Android onTouch 方向 安卓ontouch_事件处理_02


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

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

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

       ( 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拦截事件

             

            !! ) 如果返回值为false

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

down事件的处理

             

       

         

            总结:

                     事件传递只与onInterceptTouchEvent事件有关,事件处理与ononTouchEvent 的各事件返回值false或者是true有关;