• android 的事件分发从源代码分析



    转载请注明出处:http://blog.csdn.net/onlybeyond99/article/details/50680907  挨踢人one
    一、事件分发
         1、三个事件 dispatchEventTouch()、OnTouchEvent()、OnInterceptTouchEvent()
              OnInterceptTouchEvent仅仅有容器才有普通的view和Activity 都没有
              dispatchEventTouch()down,move,up事件都会调用
         2、dipatchEventTouch()的传递原理:
             
              view中dispatchTouchEvent()
                public boolean dispatchTouchEvent(MotionEvent event) { 
    if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&                           mOnTouchListener.onTouch(this, event)) {
                      return true;  
               } 
              return onTouchEvent(event); }

            viewGroup中的dispatchTouchEvent()主要方法
                    public boolean dispatchTouchEvent(MotionEvent ev) {
                                   .
                                   .
                                   .
    boolean disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0
    if (action == MotionEvent.ACTION_DOWN) {  
        if (disallowIntercept || !onInterceptTouchEvent(ev)) {
    // 假设disallowIntercept和!onInterceptTouchEvent(ev)两者有一个为true,就会进入到
    //这个条件推断中。

    disallowIntercept是指是否禁用掉事件拦截的功能,默认是false。也能够

    //通过调用requestDisallowInterceptTouchEvent方法对这个值进行改动。

     

                  。
                  。
                  。
      代码功能:调用子控件的dipatchTouchEvent()方法。
      
      }
    }
    final View target = mMotionTarget;  
       if (target == null) {  
        ev.setLocation(xf, yf); 
        if ((mPrivateFlags & CANCEL_NEXT_UP_EVENT) != 0) {  
               ev.setAction(MotionEvent.ACTION_CANCEL);  
           mPrivateFlags &= ~CANCEL_NEXT_UP_EVENT;  
            }  
       return super.dispatchTouchEvent(ev);  
     }  //假设target为空,没有子控件消费时间。调用super.dispatchTouchEvent(ev)即view的 dispatchTouchEvent() 里面包括onTouch,onClick,onTouchEvent();
     
                  view中的dipatchEventTouch()方法代码         
          3、Ontouch()和onTouchEvent(),onclick()点击事件
                onTouch()是一个接口里面的方法。 可由setOnTouchListener()设置
           onTouchEvent() 事件响应方法。属于控件里面的方法在dispatchEventTouch()方法中调用,后于onTouch()
           onClick点击事件()在onTouchEvent()中调用。

    一些控件默认有这个事件。如button

     
    4、getParent().requestDisallowInterceptTouchEvent(false);
      父容器不拦截事件
       用途。解决下拉刷新中下拉viewPager刷新
      重写viewPager的dispathTouchEvent()方法
      if(y移动的距离大于x移动的距离){ 
          getParent().requestDisallowInterceptTouchEvent(false);同意父容器拦截
          return super.dispatchTouchEvent(ev);
    可以起作用的原理。再次调用的dispatchTouchEvent()父容器是否能拦截事件的状态就变了

     独学而无友,则孤陋而寡闻!分享知识。交流技术。碰撞思想。


  • 相关阅读:
    [bzoj1468]Tree(点分治)
    [bzoj1087]: [SCOI2005]互不侵犯King(状压dp)
    [hdu5628]Clarke and math(dirichlet卷积)
    [bzoj1036]:[ZJOI2008]树的统计Count(树链剖分)
    [bzoj1026][SCOI2009]windy数(前缀和+数位dp)
    洛谷 P1714 切蛋糕(dp+RMQ)
    [hdu3507] Print Article
    [bzoj1597]: [Usaco2008 Mar]土地购买
    php基础二
    php基础
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7065741.html
Copyright © 2020-2023  润新知