事件传递,事件处理)


事件的传递:父View------>子View


事件的处理:子View------>父View




ViewGroup需要复写方法:


/**
     * 分发事件
     */


     

public boolean  
dispatchTouchEvent(MotionEvent ev) {  

 
 
                return super.dispatchTouchEvent(ev) 
;
 
        }

/**
     * 拦截事件
     */
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}

/**
     * 处理事件
     */
@Override
public boolean onTouchEvent(MotionEvent event) {
        return super.onTouchEvent(event);
}




View需要复写方法:


@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    Log.i("eventintercept","-----MyView dispatchTouchEvent()") ;
    return super.dispatchTouchEvent(event);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    Log.i("eventintercept","-----MyView onTouchEvent()") ;
    return super.onTouchEvent(event);
}




意:ViewGroup比View多一个 onInterceptTouchEvent()方法,什么事件的传递(分发)可以在ViewGroup阶段里拦截下来,使其不再往子View传递




onInterceptTouchEvent()  返回true:表示事件被拦截,不再往子View传递;交给自己处理, 

 

                                                             会调用自己的onTouchEvent()来处理事件 

 
(默认返回false)
 

 

  onTouchEvent()       返回true :表示事件已经处理完毕,不再往上处理 

 

                                    返回false:表示事件未处理完毕,将继续交给上级处理 (默认返回false) 

 
 
 
 

  dispatchTouchEvent()   :就直接return super.dispatchTouchEvent(event); 

 
 
 
 
 
 
 
onInterceptTouchEvent()里写逻辑





代码举例:






Android 禁止子View超出父View显示 子view拦截父view_androdi



ViewGroupA.java
  

   public class ViewGroupA extends LinearLayout { 
 
  

       public ViewGroupA(Context context) { 
 
  

           super(context); 
 
  

       } 
 
  
   
  

       public ViewGroupA(Context context, AttributeSet attrs) { 
 
  

           super(context, attrs); 
 
  

       } 
 
  
   
  

       public ViewGroupA(Context context, AttributeSet attrs, int defStyleAttr) { 
 
  

           super(context, attrs, defStyleAttr); 
 
  

       } 
 
  
   
  

       /** 
 
  

        * 分发事件 
 
  

        */ 
 
  

       @Override 
 
  
dispatchTouchEvent(MotionEvent ev) {  
  

           //这里写处理代码 
 
  
 
  
            //super.dispatchTouchEvent(ev)  里面会调用onInterceptTouchEvent()来检查是否需要拦截
   
        //return super.dispatchTouchEvent(ev)  往往不动,一般在onInterceptTouchEvent()写相关拦截代码
  
        return super.dispatchTouchEvent(ev);
  

       } 
 
  
   
  

       /** 
 
  

        * 拦截事件 
 
  

        */ 
 
  

       @Override 
 
  
onInterceptTouchEvent(MotionEvent ev) {  
  
        /    /在这里写相应的拦截代码,然后返回true,false
   

            Log.i("eventintercept", "-----ViewGroupA onInterceptTouchEvent()") ; 
  
   
            //不必非要return super.onInterceptTouchEvent(ev)
   

            return super.onInterceptTouchEvent(ev); 
  
   
  

       } 
 
  
   
  

       /** 
 
  

        * 处理事件 
 
  

        */ 
 
  

       @Override 
 
  
onTouchEvent(MotionEvent event) {  
  

           Log.i("eventintercept", "-----ViewGroupA onTouchEvent()") ; 
 
  

           return super.onTouchEvent(event); 
 
  

       } 
 
  

   } 
 
  
   
  
ViewGroupB.java
  

   public class ViewGroupB extends LinearLayout { 
 
  

       public ViewGroupB(Context context) { 
 
  

           super(context); 
 
  

       } 
 
  
   
  

       public ViewGroupB(Context context, AttributeSet attrs) { 
 
  

           super(context, attrs); 
 
  

       } 
 
  
   
  

       public ViewGroupB(Context context, AttributeSet attrs, int defStyleAttr) { 
 
  

           super(context, attrs, defStyleAttr); 
 
  

       } 
 
  
   
  

       @Override 
 
  
dispatchTouchEvent(MotionEvent ev) {  
  

           //这里写处理代码 
 
  

           Log.i("eventintercept", "-----ViewGroupB dispatchTouchEvent()") ; 
 
  

           return super.dispatchTouchEvent(ev); 
 
  

       } 
 
  
   
  

       /** 
 
  

        * 拦截事件 
 
  

        */ 
 
  

       @Override 
 
  
onInterceptTouchEvent(MotionEvent ev) {  
  

           //在这里写相应的拦截代码,然后返回true,false 
 
  

           Log.i("eventintercept", "-----ViewGroupB onInterceptTouchEvent()") ; 
 
  

           //不必非要return super.onInterceptTouchEvent(ev) 
 
  

           return super.onInterceptTouchEvent(ev); 
 
  

       } 
 
  
   
  

       /** 
 
  

        * 处理事件 
 
  

        */ 
 
  

       @Override 
 
  
onTouchEvent(MotionEvent event) {  
  

           Log.i("eventintercept", "-----ViewGroupB onTouchEvent()") ; 
 
  

           return super.onTouchEvent(event); 
 
  

       } 
 
  

   } 
 
  
   
  
MyView.java
  

   public class MyView extends View { 
 
  

       public MyView(Context context) { 
 
  

           super(context); 
 
  

       } 
 
  
   
  

       public MyView(Context context, AttributeSet attrs) { 
 
  

           super(context, attrs); 
 
  

       } 
 
  
   
  

       public MyView(Context context, AttributeSet attrs, int defStyleAttr) { 
 
  

           super(context, attrs, defStyleAttr); 
 
  

       } 
 
  
   
  

       @Override 
 
  
dispatchTouchEvent(MotionEvent event) {  
  

           Log.i("eventintercept","-----MyView dispatchTouchEvent()") ; 
 
  

           return super.dispatchTouchEvent(event); 
 
  

       } 
 
  
   
  

       @Override 
 
  
onTouchEvent(MotionEvent event) {  
  

           Log.i("eventintercept","-----MyView onTouchEvent()") ; 
 
  

           return super.onTouchEvent(event); 
 
  

       } 
 
  

   } 
 
  
   
  
   
  

   日志: 
 
  

   com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA dispatchTouchEvent() 
 
  

   com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA onInterceptTouchEvent() 
 
  

   com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB dispatchTouchEvent() 
 
  

   com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB onInterceptTouchEvent() 
 
  

   com.wzh.eventintercepttest I/eventintercept﹕ -----MyView dispatchTouchEvent() 
 
  

   com.wzh.eventintercepttest I/eventintercept﹕ -----MyView onTouchEvent() 
 
  

   com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB onTouchEvent() 
 
  

   com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA onTouchEvent() 
 
  
   
  

   事件传递: 
 
  

   ------>ViewGroupA    
 
  

                           dispatchTouchEvent() 
 
  

                           onInterceptTouchEvent() 
 
  

   ----->ViewGroupB  
 
  

                           dispatchTouchEvent() 
 
  

                           onInterceptTouchEvent() 
 
  

   ----->MyView  
 
  

                           dispatchTouchEvent() 
 
  

   事件处理: 
 
  

   ----->MyView 
 
  

                           onTouchEvent()     
 
  

   ----->ViewGroupB  
 
  

                           onTouchEvent()  
 
  

   ------>ViewGroupA 
 
  

                           onTouchEvent()  
 
  
   
  
   
  
   
  
   
  

   修改1: 
 
  

   ViewGroupB: 
 
  

        public boolean onInterceptTouchEvent(MotionEvent ev) { 
  
   

             //..... 
  
   
 return true ;              //在    ViewGroupB中将事件拦截,不再往子View分发;事件的传递流程在此被截断
   

        } 
  
  
   
  
   
 
  

   日志: 
 
  

    =com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA dispatchTouchEvent() 
  
   

    com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA onInterceptTouchEvent() 
  
   

    com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB dispatchTouchEvent() 
  
   
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB     onInterceptTouchEvent()     //事件在这里被拦截 
  
   
onTouchEvent()                    //事件就直接在B中被处理了   
   

    com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA onTouchEvent()                    //将处理的事件继续交给上级A 
  
  
   
  
   
  
   
  

   修改2: 
 
  

   MyView  
 
  
onTouchEvent(MotionEvent event) {   
   

            //..... 
  
   
            return true;                    //事件在MyView 中被处理后,不再交给上级继续处理,事件的处理流程在此被截断 
  
   

        } 
  
   
  

   日志: 
 
  

    com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA dispatchTouchEvent() 
  
   

    com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA onInterceptTouchEvent() 
  
   

    com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB dispatchTouchEvent() 
  
   

    com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB onInterceptTouchEvent() 
  
   

    com.wzh.eventintercepttest I/eventintercept﹕ -----MyView dispatchTouchEvent() 
  
   
onTouchEvent()  
   

                                                                                                                                               //处理流程在这里被截断 
  
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
   
 
事件传递,事件处理)  
  

   事件的传递:父View------>子View 
 
  

   事件的处理:子View------>父View 
 
  
   
  
   
  

   ViewGroup需要复写方法: 
 
  
/**
     * 分发事件
     */   
         public boolean  
 dispatchTouchEvent(MotionEvent ev) {  
 
   
                 return super.dispatchTouchEvent(ev) 
 ;
          } 
 
/**
     * 拦截事件
     */
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}

/**
     * 处理事件
     */
@Override
public boolean onTouchEvent(MotionEvent event) {
        return super.onTouchEvent(event);
}  
   
  
   
  

   View需要复写方法: 
 
  
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    Log.i("eventintercept","-----MyView dispatchTouchEvent()") ;
    return super.dispatchTouchEvent(event);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    Log.i("eventintercept","-----MyView onTouchEvent()") ;
    return super.onTouchEvent(event);
}   
    
 注   意:ViewGroup比View多一个 
  onInterceptTouchEvent()方法,什么事件的传递(分发)可以在ViewGroup阶段里拦截下来,使其不再往子View传递  
   
  
   
  
  
   
  

   onInterceptTouchEvent()  返回true:表示事件被拦截,不再往子View传递;交给自己处理, 
 
  

                                                              会调用自己的onTouchEvent()来处理事件 
 
  
(默认返回false)
  

  

   onTouchEvent()       返回true :表示事件已经处理完毕,不再往上处理 
 
  

                                     返回false:表示事件未处理完毕,将继续交给上级处理 (默认返回false) 
 
  
   
  

   dispatchTouchEvent()   :就直接return super.dispatchTouchEvent(event); 
 
  
   
  
   
  
onInterceptTouchEvent()里写逻辑
  
   
  
   
  
   
  

   代码举例: 
 
  

  
    
   
ViewGroupA.java
   

    public class ViewGroupA extends LinearLayout { 
  
   

        public ViewGroupA(Context context) { 
  
   

            super(context); 
  
   

        } 
  
   
    
   

        public ViewGroupA(Context context, AttributeSet attrs) { 
  
   

            super(context, attrs); 
  
   

        } 
  
   
    
   

        public ViewGroupA(Context context, AttributeSet attrs, int defStyleAttr) { 
  
   

            super(context, attrs, defStyleAttr); 
  
   

        } 
  
   
    
   

        /** 
  
   

         * 分发事件 
  
   

         */ 
  
   

        @Override 
  
   
dispatchTouchEvent(MotionEvent ev) {   
   

            //这里写处理代码 
  
   
 
   
             //super.dispatchTouchEvent(ev)  里面会调用onInterceptTouchEvent()来检查是否需要拦截
    
        //return super.dispatchTouchEvent(ev)  往往不动,一般在onInterceptTouchEvent()写相关拦截代码
   
        return super.dispatchTouchEvent(ev);
   

        } 
  
   
    
   

        /** 
  
   

         * 拦截事件 
  
   

         */ 
  
   

        @Override 
  
   
onInterceptTouchEvent(MotionEvent ev) {   
   
        /     /在这里写相应的拦截代码,然后返回true,false
    

             Log.i("eventintercept", "-----ViewGroupA onInterceptTouchEvent()") ; 
   
    
             //不必非要return super.onInterceptTouchEvent(ev)
    

             return super.onInterceptTouchEvent(ev); 
   
    
   

        } 
  
   
    
   

        /** 
  
   

         * 处理事件 
  
   

         */ 
  
   

        @Override 
  
   
onTouchEvent(MotionEvent event) {   
   

            Log.i("eventintercept", "-----ViewGroupA onTouchEvent()") ; 
  
   

            return super.onTouchEvent(event); 
  
   

        } 
  
   

    } 
  
   
    
   
ViewGroupB.java
   

    public class ViewGroupB extends LinearLayout { 
  
   

        public ViewGroupB(Context context) { 
  
   

            super(context); 
  
   

        } 
  
   
    
   

        public ViewGroupB(Context context, AttributeSet attrs) { 
  
   

            super(context, attrs); 
  
   

        } 
  
   
    
   

        public ViewGroupB(Context context, AttributeSet attrs, int defStyleAttr) { 
  
   

            super(context, attrs, defStyleAttr); 
  
   

        } 
  
   
    
   

        @Override 
  
   
dispatchTouchEvent(MotionEvent ev) {   
   

            //这里写处理代码 
  
   

            Log.i("eventintercept", "-----ViewGroupB dispatchTouchEvent()") ; 
  
   

            return super.dispatchTouchEvent(ev); 
  
   

        } 
  
   
    
   

        /** 
  
   

         * 拦截事件 
  
   

         */ 
  
   

        @Override 
  
   
onInterceptTouchEvent(MotionEvent ev) {   
   

            //在这里写相应的拦截代码,然后返回true,false 
  
   

            Log.i("eventintercept", "-----ViewGroupB onInterceptTouchEvent()") ; 
  
   

            //不必非要return super.onInterceptTouchEvent(ev) 
  
   

            return super.onInterceptTouchEvent(ev); 
  
   

        } 
  
   
    
   

        /** 
  
   

         * 处理事件 
  
   

         */ 
  
   

        @Override 
  
   
onTouchEvent(MotionEvent event) {   
   

            Log.i("eventintercept", "-----ViewGroupB onTouchEvent()") ; 
  
   

            return super.onTouchEvent(event); 
  
   

        } 
  
   

    } 
  
   
    
   
MyView.java
   

    public class MyView extends View { 
  
   

        public MyView(Context context) { 
  
   

            super(context); 
  
   

        } 
  
   
    
   

        public MyView(Context context, AttributeSet attrs) { 
  
   

            super(context, attrs); 
  
   

        } 
  
   
    
   

        public MyView(Context context, AttributeSet attrs, int defStyleAttr) { 
  
   

            super(context, attrs, defStyleAttr); 
  
   

        } 
  
   
    
   

        @Override 
  
   
dispatchTouchEvent(MotionEvent event) {   
   

            Log.i("eventintercept","-----MyView dispatchTouchEvent()") ; 
  
   

            return super.dispatchTouchEvent(event); 
  
   

        } 
  
   
    
   

        @Override 
  
   
onTouchEvent(MotionEvent event) {   
   

            Log.i("eventintercept","-----MyView onTouchEvent()") ; 
  
   

            return super.onTouchEvent(event); 
  
   

        } 
  
   

    } 
  
   
    
   
    
   

    日志: 
  
   

    com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA dispatchTouchEvent() 
  
   

    com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA onInterceptTouchEvent() 
  
   

    com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB dispatchTouchEvent() 
  
   

    com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB onInterceptTouchEvent() 
  
   

    com.wzh.eventintercepttest I/eventintercept﹕ -----MyView dispatchTouchEvent() 
  
   

    com.wzh.eventintercepttest I/eventintercept﹕ -----MyView onTouchEvent() 
  
   

    com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB onTouchEvent() 
  
   

    com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA onTouchEvent() 
  
   
    
   

    事件传递: 
  
   

    ------>ViewGroupA    
  
   

                            dispatchTouchEvent() 
  
   

                            onInterceptTouchEvent() 
  
   

    ----->ViewGroupB  
  
   

                            dispatchTouchEvent() 
  
   

                            onInterceptTouchEvent() 
  
   

    ----->MyView  
  
   

                            dispatchTouchEvent() 
  
   

    事件处理: 
  
   

    ----->MyView 
  
   

                            onTouchEvent()     
  
   

    ----->ViewGroupB  
  
   

                            onTouchEvent()  
  
   

    ------>ViewGroupA 
  
   

                            onTouchEvent()  
  
   
    
   
    
   
    
   
    
   

    修改1: 
  
   

    ViewGroupB: 
  
   

         public boolean onInterceptTouchEvent(MotionEvent ev) { 
   
    

              //..... 
   
    
 return true ;              //在     ViewGroupB中将事件拦截,不再往子View分发;事件的传递流程在此被截断
    

         } 
   
   
    
   
    
  
   

    日志: 
  
   

     =com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA dispatchTouchEvent() 
   
    

     com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA onInterceptTouchEvent() 
   
    

     com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB dispatchTouchEvent() 
   
    
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB      onInterceptTouchEvent()     //事件在这里被拦截 
   
    
onTouchEvent()                    //事件就直接在B中被处理了    
    

     com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA onTouchEvent()                    //将处理的事件继续交给上级A 
   
   
    
   
    
   
    
   

    修改2: 
  
   

    MyView  
  
   
onTouchEvent(MotionEvent event) {    
    

             //..... 
   
    
             return true;                    //事件在MyView 中被处理后,不再交给上级继续处理,事件的处理流程在此被截断 
   
    

         } 
   
    
   

    日志: 
  
   

     com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA dispatchTouchEvent() 
   
    

     com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA onInterceptTouchEvent() 
   
    

     com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB dispatchTouchEvent() 
   
    

     com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB onInterceptTouchEvent() 
   
    

     com.wzh.eventintercepttest I/eventintercept﹕ -----MyView dispatchTouchEvent() 
   
    
onTouchEvent()  
    

                                                                                                                                                //处理流程在这里被截断