码迷,mamicode.com
首页 > 移动开发 > 详细

Android-事件分发机制

时间:2016-07-15 06:22:10      阅读:735      评论:0      收藏:0      [点我收藏+]

标签:

http://blog.csdn.net/guolin_blog/article/details/9097463

http://blog.csdn.net/guolin_blog/article/details/9153747

 

看了郭霖大神的这两篇文章,可以小小的做一个笔记

 

首先从全局来看,也就是ViewGroup

技术分享

ViewGroup就是各种常用布局的父类

 

如果在ViewGroup里加入按钮,那么点击按钮时:

  • onTouch返回false : onTouch先执行,onClick方法后执行。如果点击空白区域,则只有OnTouch会执行。这说明onTouch方法是先于onClick方法的
  • onTouch返回true :  onTouch运行,onClick不运行

 

 

 

 

touch事件的层级传递

我们都知道如果给一个控件注册了touch事件,每次点击它的时候都会触发一系列的ACTION_DOWN,ACTION_MOVE,ACTION_UP等事件。这里需要注意,如果你在执行ACTION_DOWN的时候返回了false,后面一系列其它的action就不会再得到执行了。简单的说,就是当dispatchTouchEvent在进行事件分发的时候,只有前一个action返回true,才会触发后一个action

 

源码解析:

点击button时,一定会调用Button的dispatchTouchEvent方法。而这个方法不是在Button里定义的,而是在View里

技术分享

 

 

dispatchTouchEvent方法的源码:

public boolean dispatchTouchEvent(MotionEvent event) {  
    if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&  
            mOnTouchListener.onTouch(this, event)) {  
        return true;  
    }  
    return onTouchEvent(event);  
}

可以看到,onTouch执行需要两个条件:

  1. setOnTouchListener初始化
  2. 控件为clickable

而OnTouchEvent执行除了上述两个条件外,还需要onTouch返回false,才会执行

 

在onTouchEvent里,如果控件是可点击的,就会进入performClick()方法

public boolean performClick() {  
    sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);  
    if (mOnClickListener != null) {  
        playSoundEffect(SoundEffectConstants.CLICK);  
        mOnClickListener.onClick(this);  
        return true;  
    }  
    return false;  
}  

如果setOnClickListener方法调用后,就可以调用onClick方法

在此时,虽然前面onTouch返回的是false,但进入了onTouchEvent后,最终会返回一个true,使ACTION_DOWN,ACTION_MOVE,ACTION_UP等事件执行

 

如果控件不可点击,onTouchEvent就会直接返回false,后面的都不执行

 

Android-事件分发机制

标签:

原文地址:http://www.cnblogs.com/qlky/p/5672115.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!