View的事件拦截机制



事件包括:事件的分发,拦截,处理 ( 事件传递,事件处理)
事件的传递:父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:表示不拦截该事件,事件将往子View传递 (默认返回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
    public boolean  dispatchTouchEvent(MotionEvent ev) {
        //这里写处理代码
        Log.i("eventintercept", "-----ViewGroupA dispatchTouchEvent()") ;  
         //super.dispatchTouchEvent(ev)  里面会调用onInterceptTouchEvent()来检查是否需要拦截
        //return super.dispatchTouchEvent(ev)  往往不动,一般在onInterceptTouchEvent()写相关拦截代码
        return super.dispatchTouchEvent(ev);
    }

    /**
     * 拦截事件
     */
    @Override
    public boolean  onInterceptTouchEvent(MotionEvent ev) {
        / /在这里写相应的拦截代码,然后返回true,false
        Log.i("eventintercept", "-----ViewGroupA onInterceptTouchEvent()") ;
         //不必非要return super.onInterceptTouchEvent(ev)
        return super.onInterceptTouchEvent(ev);

    }

    /**
     * 处理事件
     */
    @Override
    public boolean  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
    public boolean  dispatchTouchEvent(MotionEvent ev) {
        //这里写处理代码
        Log.i("eventintercept", "-----ViewGroupB dispatchTouchEvent()") ;
        return super.dispatchTouchEvent(ev);
    }

    /**
     * 拦截事件
     */
    @Override
    public boolean  onInterceptTouchEvent(MotionEvent ev) {
        //在这里写相应的拦截代码,然后返回true,false
        Log.i("eventintercept", "-----ViewGroupB onInterceptTouchEvent()") ;
        //不必非要return super.onInterceptTouchEvent(ev)
        return super.onInterceptTouchEvent(ev);
    }

    /**
     * 处理事件
     */
    @Override
    public boolean  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
    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);
    }
}


日志:
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()     //事件在这里被拦截
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB  onTouchEvent()                    //事件就直接在B中被处理了
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA onTouchEvent()                    //将处理的事件继续交给上级A



修改2:
MyView 
    public boolean  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()
com.wzh.eventintercepttest I/eventintercept﹕ -----MyView  onTouchEvent()            //事件在MyView中被处理后,不再交给上级继续处理了
                                                                                                                                           //处理流程在这里被截断


















事件包括:事件的分发,拦截,处理 ( 事件传递,事件处理)
事件的传递:父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:表示不拦截该事件,事件将往子View传递 (默认返回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
    public boolean  dispatchTouchEvent(MotionEvent ev) {
        //这里写处理代码
        Log.i("eventintercept", "-----ViewGroupA dispatchTouchEvent()") ;  
         //super.dispatchTouchEvent(ev)  里面会调用onInterceptTouchEvent()来检查是否需要拦截
        //return super.dispatchTouchEvent(ev)  往往不动,一般在onInterceptTouchEvent()写相关拦截代码
        return super.dispatchTouchEvent(ev);
    }

    /**
     * 拦截事件
     */
    @Override
    public boolean  onInterceptTouchEvent(MotionEvent ev) {
        / /在这里写相应的拦截代码,然后返回true,false
        Log.i("eventintercept", "-----ViewGroupA onInterceptTouchEvent()") ;
         //不必非要return super.onInterceptTouchEvent(ev)
        return super.onInterceptTouchEvent(ev);

    }

    /**
     * 处理事件
     */
    @Override
    public boolean  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
    public boolean  dispatchTouchEvent(MotionEvent ev) {
        //这里写处理代码
        Log.i("eventintercept", "-----ViewGroupB dispatchTouchEvent()") ;
        return super.dispatchTouchEvent(ev);
    }

    /**
     * 拦截事件
     */
    @Override
    public boolean  onInterceptTouchEvent(MotionEvent ev) {
        //在这里写相应的拦截代码,然后返回true,false
        Log.i("eventintercept", "-----ViewGroupB onInterceptTouchEvent()") ;
        //不必非要return super.onInterceptTouchEvent(ev)
        return super.onInterceptTouchEvent(ev);
    }

    /**
     * 处理事件
     */
    @Override
    public boolean  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
    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);
    }
}


日志:
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()     //事件在这里被拦截
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB  onTouchEvent()                    //事件就直接在B中被处理了
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA onTouchEvent()                    //将处理的事件继续交给上级A



修改2:
MyView 
    public boolean  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()
com.wzh.eventintercepttest I/eventintercept﹕ -----MyView  onTouchEvent()            //事件在MyView中被处理后,不再交给上级继续处理了
                                                                                                                                           //处理流程在这里被截断


















  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值