您的位置:首页 > 移动开发 > Android开发

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

2016-10-12 12:11 281 查看
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;
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: