Android中的事件分发机制

Android中的事件分发机制

作者:丁明祥
邮箱:2780087178@qq.com

这篇文章这周之内尽量写完

参考资料:

Android事件分发机制完全解析,带你从源码的角度彻底理解(上)

Android事件分发机制完全解析,带你从源码的角度彻底理解(下)

Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()

细说Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)

1.Android onTouch()事件处理分发中的三个重要方法:

dispatchTouchEvent()

onInterceptTouchEvent()

onTouchEvent()

2.onTouch()事件

onTouch事件包括一个ACTION_DOWN,若干个ACTION_MOVE和一个ACTION_UP等的一系列事件组合。

3.onTouch()函数返回值有什么用

如果我们将返回值改成true,则onTouch()会处理并截获该事件。(截获的意思是指如果我们同时监听onTouch(),和onClick(),而onTouch()截获了该事件,则onClick()将不会被触发)。

4.上面的三个重要方法详细说明

dispatchTouchEvent()处理触摸事件分发,当onTouch()被触发时默认调用该事件,

``onInterceptTouchEvent()中断事件继续分发,在dispatchTouchEvent()`中选择调用

onTouchEvent()接受到事件之后负责处理

View里,有两个回调函数 :

public boolean dispatchTouchEvent(MotionEvent ev);    
public boolean onTouchEvent(MotionEvent ev);   

ViewGroup里,有三个回调函数 :

public boolean dispatchTouchEvent(MotionEvent ev);    
public boolean onInterceptTouchEvent(MotionEvent ev);    
public boolean onTouchEvent(MotionEvent ev);  

在Activity里,有两个回调函数 :

public boolean dispatchTouchEvent(MotionEvent ev);    
public boolean onTouchEvent(MotionEvent ev);    

5.看一下dispatchTouchEvent()的源码`

public boolean dispatchTouchEvent(MotionEvent event) {  
    if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&  
            mOnTouchListener.onTouch(this, event)) {  
      //onTouch()函数的返回值决定了是直接返回还是调用onTouchEvent进行处理
        return true;  
    }  
    return onTouchEvent(event);  
} 
6.onTouchEvent()源码太长了,懒得看,只贴一点重要的东西
public boolean onTouchEvent(MotionEvent event) {  
    final int viewFlags = mViewFlags;  
    if ((viewFlags & ENABLED_MASK) == DISABLED) {  
        return (((viewFlags & CLICKABLE) == CLICKABLE ||  
                (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE));  
    }  
    if (mTouchDelegate != null) {  
        if (mTouchDelegate.onTouchEvent(event)) {  
            return true;  
        }  
    }  
    if (((viewFlags & CLICKABLE) == CLICKABLE ||  
            (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) {  
      //switch里面就是onTouch()触发的四个事件
        switch (event.getAction()) {  
            case MotionEvent.ACTION_UP:  
            ...
            case MotionEvent.ACTION_DOWN:  
            ...
            case MotionEvent.ACTION_CANCEL:  
            ...
            case MotionEvent.ACTION_MOVE: 
            ...
            }  
        return true;  
    }  
    return false;  
}  
7.一个简单的问题
posted @ 2017-07-06 08:12  丁明祥  阅读(138)  评论(0编辑  收藏  举报