MotionEvent事件在onInterceptTouchEvent()、onTouchEvent()中的传递顺序

 onInterceptTouchEvent()用于处理事件并改变事件的传递方向。处理事件这个不用说了,你在函数内部编写代码处理就可以了。而决定传递方向的是返回值,返回为false时事件会传递给子控件的onInterceptTouchEvent();返回值为true时事件会传递给当前控件的onTouchEvent(),而不在传递给子控件,这就是所谓的Intercept(截断)。

onTouchEvent() 用于处理事件,返回值决定当前控件是否消费(consume)了这个事件。可能你要问是否消费了又区别吗,反正我已经针对事件编写了处理代码?答案是有区别!比如ACTION_MOVE或者ACTION_UP发生的前提是一定曾经发生了ACTION_DOWN,如果你没有消费ACTION_DOWN,那么系统会认为ACTION_DOWN没有发生过,所以ACTION_MOVE或者ACTION_UP就不能被捕获。

本文源地址:http://www.cnblogs.com/rocky_yi/archive/2011/01/21/1941522.html# ,转载请注明出处!

<? xml version="1.0" encoding="utf-8" ?>
< com.touchstudy.LayoutView1  xmlns:android ="http://schemas.android.com/apk/res/android"
    android:orientation
="vertical"
    android:layout_width
="fill_parent"
    android:layout_height
="fill_parent"   >
    
< com.touchstudy.LayoutView2
        
android:orientation ="vertical"
        android:layout_width
="fill_parent"
        android:layout_height
="fill_parent"
        android:gravity
="center" >
       
< com.touchstudy.MyTextView 
            
android:layout_width ="wrap_content"
            android:layout_height
="wrap_content"
            android:id
="@+id/tv"
            android:text
="AB"
            android:textSize
="40sp"
            android:textStyle
="bold"
            android:background
="#FFFFFF"
            android:textColor
="#0000FF" />
   
</ com.touchstudy.LayoutView2 >
</ com.touchstudy.LayoutView1 >

 

 

在没有重写onInterceptTouchEvent()和onTouchEvent()的情况下(他们的返回值都是false), 对上面这个布局,MotionEvent事件的传递顺序如下:

 MotionEvent事件在onInterceptTouchEvent()、onTouchEvent()中的传递顺序

当某个控件的onInterceptTouchEvent()返回值为true时,就会发生截断,事件被传到当前控件的onTouchEvent()。如我们将LayoutView2的onInterceptTouchEvent()返回值为true,则传递流程变成:

 MotionEvent事件在onInterceptTouchEvent()、onTouchEvent()中的传递顺序

 如果我们同时将LayoutView2的onInterceptTouchEvent()和onTouchEvent()设置成true,那么LayoutView2将消费被传递的事件,同时后续事件(如跟着ACTION_DOWN的ACTION_MOVE或者ACTION_UP)会直接传给LayoutView2的onTouchEvent(),不传给其他任何控件的任何函数。同时传递给子空间一个ACTION_CANCEL事件。传递流程变成(图中没有画出ACTION_CANCEL事件):

 MotionEvent事件在onInterceptTouchEvent()、onTouchEvent()中的传递顺序         MotionEvent事件在onInterceptTouchEvent()、onTouchEvent()中的传递顺序

附SDK给出的说明:

·  You will receive the down event here.
·  The down event will be handled either by a child of this view group, or given to your own onTouchEvent() method to handle; this means you should implement onTouchEvent() to return true, so you will continue to see the rest of the gesture (instead of looking for a parent view to handle it). Also, by returning true from onTouchEvent(), you will not receive any following events in onInterceptTouchEvent() and all touch processing must happen in onTouchEvent() like normal.
·  For as long as you return false from this function, each following event (up to and including the final up) will be delivered first here and then to the target's onTouchEvent().
·  If you return true from here, you will not receive any following events: the target view will receive the same event but with the action ACTION_CANCEL, and all further events will be delivered to your onTouchEvent() method and no longer appear here.
 

示例对应的Java代码(来自http://blog.csdn.net/ddna/archive/2010/04/11/5473293.aspx) 

 代码

// 主Activity: InterceptTouchStudyActivity.java:
 
public   class  InterceptTouchStudyActivity  extends  Activity {

    
static   final  String TAG  =   " ITSActivity " ;

    TextView tv;
   

    
/**  Called when the activity is first created.  */

    @Override

    
public   void  onCreate(Bundle savedInstanceState) {
        
super .onCreate(savedInstanceState);
        setContentView(R.layout.layers_touch_pass_test);
     }
 }

      
// LayoutView1.java:

      
public   class  LayoutView1  extends  LinearLayout {

         
private   final  String TAG  =   " LayoutView1 " ;

           
public  LayoutView1(Context context, AttributeSet attrs) {
         
super (context, attrs);
         Log.d(TAG,TAG);
     }

 

     @Override
     
public   boolean  onInterceptTouchEvent(MotionEvent ev) {
         
int  action  =  ev.getAction();
         
switch (action){
         
case  MotionEvent.ACTION_DOWN:
              Log.d(TAG,
" onInterceptTouchEvent action:ACTION_DOWN " );
//             return true;
               break ;
         
case  MotionEvent.ACTION_MOVE:
              Log.d(TAG,
" onInterceptTouchEvent action:ACTION_MOVE " );
              
break ;
         
case  MotionEvent.ACTION_UP:
              Log.d(TAG,
" onInterceptTouchEvent action:ACTION_UP " );
              
break ;
         
case  MotionEvent.ACTION_CANCEL:
              Log.d(TAG,
" onInterceptTouchEvent action:ACTION_CANCEL " );
              
break ;
         }   

         
return   false ;
     }

 

     @Override
     
public   boolean  onTouchEvent(MotionEvent ev) {
         
int  action  =  ev.getAction();
         
switch (action){
         
case  MotionEvent.ACTION_DOWN:
              Log.d(TAG,
" onTouchEvent action:ACTION_DOWN " );
              
break ;
         
case  MotionEvent.ACTION_MOVE:
              Log.d(TAG,
" onTouchEvent action:ACTION_MOVE " );
              
break ;
         
case  MotionEvent.ACTION_UP:
              Log.d(TAG,
" onTouchEvent action:ACTION_UP " );
              
break ;
         
case  MotionEvent.ACTION_CANCEL:
              Log.d(TAG,
" onTouchEvent action:ACTION_CANCEL " );
              
break ;
         }       
         
return   true ;
     }

 

     @Override
     
protected   void  onLayout( boolean  changed,  int  l,  int  t,  int  r,  int  b) {
         
//  TODO Auto-generated method stub
          super .onLayout(changed, l, t, r, b);
     }

     @Override
     
protected   void  onMeasure( int  widthMeasureSpec,  int  heightMeasureSpec) {
         
//  TODO Auto-generated method stub
          super .onMeasure(widthMeasureSpec, heightMeasureSpec);
     }
}

// LayoutView2.java:
public   class  LayoutView2  extends  LinearLayout {
    
private   final  String TAG  =   " LayoutView2 " ;   

    
public  LayoutView2(Context context, AttributeSet attrs) {
       
super (context, attrs);
       Log.d(TAG,TAG);
    }

    @Override
    
public   boolean  onInterceptTouchEvent(MotionEvent ev) {
       
int  action  =  ev.getAction();
       
switch (action){
       
case  MotionEvent.ACTION_DOWN:
           Log.d(TAG,
" onInterceptTouchEvent action:ACTION_DOWN " );
           
break ;
       
case  MotionEvent.ACTION_MOVE:
           Log.d(TAG,
" onInterceptTouchEvent action:ACTION_MOVE " );
           
break ;
       
case  MotionEvent.ACTION_UP:
           Log.d(TAG,
" onInterceptTouchEvent action:ACTION_UP " );
           
break ;
       
case  MotionEvent.ACTION_CANCEL:
           Log.d(TAG,
" onInterceptTouchEvent action:ACTION_CANCEL " );
           
break ;
       }  
       
return   false ;
}
 

    @Override
    
public   boolean  onTouchEvent(MotionEvent ev) {
       
int  action  =  ev.getAction();
       
switch (action){
       
case  MotionEvent.ACTION_DOWN:
           Log.d(TAG,
" onTouchEvent action:ACTION_DOWN " );
           
break ;
       
case  MotionEvent.ACTION_MOVE:
           Log.d(TAG,
" onTouchEvent action:ACTION_MOVE " );
           
break ;
       
case  MotionEvent.ACTION_UP:
           Log.d(TAG,
" onTouchEvent action:ACTION_UP " );
           
break ;
       
case  MotionEvent.ACTION_CANCEL:
           Log.d(TAG,
" onTouchEvent action:ACTION_CANCEL " );
           
break ;
       }     

       
return   true ;
    } 
}



// MyTextView.java:
public   class  MyTextView  extends  TextView {
    
private   final  String TAG  =   " MyTextView " ;   

    
public  MyTextView(Context context, AttributeSet attrs) {
       
super (context, attrs);
       Log.d(TAG,TAG);
    }

     @Override
    
public   boolean  onTouchEvent(MotionEvent ev) {
       
int  action  =  ev.getAction();
       
switch (action){
       
case  MotionEvent.ACTION_DOWN:
           Log.d(TAG,
" onTouchEvent action:ACTION_DOWN " );
           
break ;
       
case  MotionEvent.ACTION_MOVE:
           Log.d(TAG,
" onTouchEvent action:ACTION_MOVE " );
           
break ;
       
case  MotionEvent.ACTION_UP:
           Log.d(TAG,
" onTouchEvent action:ACTION_UP " );
           
break ;
       
case  MotionEvent.ACTION_CANCEL:
           Log.d(TAG,
" onTouchEvent action:ACTION_CANCEL " );
           
break ;
       }      
       
return   false ;
    }   

    
public   void  onClick(View v) {
       Log.d(TAG, 
" onClick " );
    }   

    
public   boolean  onLongClick(View v) {
       Log.d(TAG, 
" onLongClick " );
       
return   false ;
    }
}

 

你可能感兴趣的:(MotionEvent事件在onInterceptTouchEvent()、onTouchEvent()中的传递顺序)