Android--Touch 事件的分发和消费机制

Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev)onInterceptTouchEvent(MotionEvent ev)onTouchEvent(MotionEvent ev);能够响应这些方法的控件包括:ViewGroup 及其子类Activity。方法与控件的对应关系如下表所示:

Touch 事件相关方法   方法功能  
  ViewGroup   
     Activity     
  public boolean dispatchTouchEvent(MotionEvent ev) 事件分发 
 Yes  Yes
  public boolean onInterceptTouchEvent(MotionEvent ev)  
事件拦截 
 Yes  No
  public boolean onTouchEvent(MotionEvent ev) 事件响应 
 Yes  Yes
用一个实例来说明。简单实现一个小功能:当触摸蓝色区域时,红色区域及最外成区域不响应,只有蓝色区域响应。当触摸红色区域时,只有红色区域响应,其它不响应。
父子view关系如下:
最外层 ---> 红色区域 --->蓝色区域


onInterceptTouchEvent():如果返回值为true,则阻止向下传播touch事件。(是向下方向,这里是 :最外层 ---> 红色区域 --->蓝色区域 )。
onTouchEvent():如果返回值为true,则阻止向上传播touch事件。(是向上方向,这里是 :最外层 <---红色区域 -<--蓝色区域 )。
事件方法的执行顺序:
dispatchTouchEvent --->onInterceptTouchEvent--->getTouchAction
=======TouchEventActivity.dispatchTouchEvent:ACTION_DOWN
附上触摸蓝色区域的Log
09-23 12:03:54.299 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventFather.dispatchTouchEvent:ACTION_DOWN
09-23 12:03:54.299 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventFather.onInterceptTouchEvent:ACTION_DOWN
09-23 12:03:54.299 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventChild.dispatchTouchEvent:ACTION_DOWN
09-23 12:03:54.299 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventChild.onInterceptTouchEvent:ACTION_DOWN
09-23 12:03:54.300 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventChild.onTouchEvent:ACTION_DOWN
09-23 12:03:54.353 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventActivity.dispatchTouchEvent:ACTION_UP
09-23 12:03:54.353 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventFather.dispatchTouchEvent:ACTION_UP
09-23 12:03:54.353 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventFather.onInterceptTouchEvent:ACTION_UP
09-23 12:03:54.354 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventChild.dispatchTouchEvent:ACTION_UP
09-23 12:03:54.354 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventChild.onTouchEvent:ACTION_UP

附上触摸红色区域的log 
09-23 12:05:42.491 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventActivity.dispatchTouchEvent:ACTION_DOWN
09-23 12:05:42.491 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventFather.dispatchTouchEvent:ACTION_DOWN
09-23 12:05:42.492 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventFather.onInterceptTouchEvent:ACTION_DOWN
09-23 12:05:42.492 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventFather.onTouchEvent:ACTION_DOWN
09-23 12:05:42.492 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventActivity.onTouchEvent:ACTION_DOWN
09-23 12:05:42.545 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventActivity.dispatchTouchEvent:ACTION_UP
09-23 12:05:42.545 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventActivity.onTouchEvent:ACTION_UP

最外层:touch事件相关方法:
@Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        Log.d(TouchEventUtil.TAG,"=======TouchEventActivity.dispatchTouchEvent:"
                + TouchEventUtil.getTouchAction(event.getAction()));
        return super.dispatchTouchEvent(event);
    }
    @Override
    public boolean onTouchEvent(MotionEvent event){
        Log.d(TouchEventUtil.TAG,"=======TouchEventActivity.onTouchEvent:"
                + TouchEventUtil.getTouchAction(event.getAction()));
        return super.onTouchEvent(event);
    }
红色层:touch事件相关方法:
@Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        Log.d(TouchEventUtil.TAG,"=======TouchEventFather.dispatchTouchEvent:"
                + TouchEventUtil.getTouchAction(event.getAction()));
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event){
        Log.d(TouchEventUtil.TAG,"=======TouchEventFather.onInterceptTouchEvent:"
                + TouchEventUtil.getTouchAction(event.getAction()));
        return super.onInterceptTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event){
        Log.d(TouchEventUtil.TAG,"=======TouchEventFather.onTouchEvent:"
                + TouchEventUtil.getTouchAction(event.getAction()));
        return true;
    }
蓝色层:touch事件相关方法:
@Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        Log.d(TouchEventUtil.TAG,"=======TouchEventFather.dispatchTouchEvent:"
                + TouchEventUtil.getTouchAction(event.getAction()));
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event){
        Log.d(TouchEventUtil.TAG,"=======TouchEventFather.onInterceptTouchEvent:"
                + TouchEventUtil.getTouchAction(event.getAction()));
        return super.onInterceptTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event){
        Log.d(TouchEventUtil.TAG,"=======TouchEventFather.onTouchEvent:"
                + TouchEventUtil.getTouchAction(event.getAction()));
        return true;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值