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()中调用。一些控件默认有这个事件,如按钮
 
4、getParent().requestDisallowInterceptTouchEvent(false);
  父容器不拦截事件
   用途,解决下拉刷新中下拉viewPager刷新
  重写viewPager的dispathTouchEvent()方法
  if(y移动的距离大于x移动的距离){ 
      getParent().requestDisallowInterceptTouchEvent(false);允许父容器拦截
      return super.dispatchTouchEvent(ev);
能够起作用的原理,再次调用的dispatchTouchEvent()父容器能否拦截事件的状态就变了

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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值