zoukankan      html  css  js  c++  java
  • 事件分发测试结果与理解总结

         *   总结:
         *     事件分发其实调用机制应该是这样的:(这里说的仅仅是系统的,其他的可能中途修改不一定是这样)
         *     总: dispatchTouchEvent会在在super.dispatchTouchEvent中最终会调用onTouchEvent, 以及onInterceptTouchEvent方法
         *     1.在调用onTouchEvent作为本事件是否被消耗了,如果自己没消耗会由父来消耗,如果使用了
         *     requestDisallowInterceptTouchEvent阻止父消耗,则会由Activity消耗以此结束
         *     2.在调用onInterceptTouchEvent方法中根据返回判断是否需要调用子dispatchTouchEvent事件,
         *       super.onInterceptTouchEvent默认返回false
         *     3.当子View把down 事件消耗了requestDisallowInterceptTouchEvent(true)才能把后续的事件交给子View,并且不再调用父的onTouchEvent
         *     4.当事件分发下去,onInterceptTouchEvent在调用子View的requestDisallowInterceptTouchEvent时候如果down事件返回的false,
         *       那么后续事件onInterceptTouchEvent也不会再给子view了,转而调用自己的Touch
         *     5.事件消耗,可以在onTouchEvent返回true ,或者dispatchTouchEvent 是true
         
         综上所述:底层简写代码应是这样的
        boolean isContinuDispatch=true;//后续事件继续分发
        boolean interceptTouchEvent=false;//是否调用自己的触摸事件(因为如果子view  requestDisallowInterceptTouchEvent(true)自己的touch就无效了)
       
        public boolean dispatchTouchEvent(MotionEvent ev) {
                //判断自己是否需要拦截
                if (onInterceptTouchEvent(ev)){
                    //按下事件判断后续事件是否还需要分发
                    if (ev.getAction()==MotionEvent.ACTION_DOWN){
                       return  isContinuDispatch=子View.dispatchTouchEvent(ev);
                    }else {
                        //其他事件
                        if (isContinuDispatch){
                          return   子View.dispatchTouchEvent(ev);
                        }
                    }
                }
            //没有被子View拦截,并且子View后续是不收的
            if (!interceptTouchEvent &&!isContinuDispatch){
                    //自己触摸事件决定是否消耗
                return   onTouchEvent(ev);
            }else {
            //被阻止,事件没有被消耗,只能有Activity的OnTouch处理了
            
           return false;
            }
        }
     

    以上总结是我自己测试的结果,与网上说法不一样,有些疑惑,还望大神指点

  • 相关阅读:
    Springboot注解@Scheduled定时任务的使用
    Springboot整合WebSocket和RabbitMQ实现服务器消息推送
    Springboot集成WebSocket实现消息推送功能
    RabbitMq: 主题交换机的使用(Topic Exchange)
    Rabbitmq: @RabbitListener 和 @RabbitHandler 搭配使用
    RabbitMQ开启 mqtt 协议
    @Import的简单使用
    idea快速生成对应数据库的实体类
    HttpClient封装工具类
    TypeScript基本概念
  • 原文地址:https://www.cnblogs.com/lizhanqi/p/9289928.html
Copyright © 2011-2022 走看看