zoukankan      html  css  js  c++  java
  • 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()父容器是否能拦截事件的状态就变了

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


  • 相关阅读:
    delphi7在windows server 2003企业版上不能打开项目的选项(Options)窗口的解决方法
    简单的两个字“谢谢”,会让我坚持我的写作,我也要谢谢你们
    F41GUT 安装Windows server 2003系统后无法安装显卡驱动的解决办法
    远程桌面无法登录windows server 2003服务器
    F41GUT 安装Windows server 2003系统后无法安装显卡驱动的解决办法
    MS SQL Server 2000版在windows server 2003企业版系统上运行时造成数据库suspect的解决方法
    delphi7在windows server 2003企业版上不能打开项目的选项(Options)窗口的解决方法
    远程桌面无法登录windows server 2003服务器
    MS SQL Server 2000版在windows server 2003企业版系统上运行时造成数据库suspect的解决方法
    关于ajax 和josn
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7065741.html
Copyright © 2011-2022 走看看