Android事件分发机制浅析

Posted yian_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android事件分发机制浅析相关的知识,希望对你有一定的参考价值。

有段时间没有写博客了,以前总是感觉对android中的事件传递机制有着相对模糊的理解,今天抽空静心详细看了看。:

  • 前言
  • 主要方法
  • 流程详解

  • 前文

    总觉得知识必要要总结,不然就算再熟悉的东西,一段时间不接触就容易遗忘。
    Android中的触摸事件传递机制最重要的是是dispatchTouchEvent(),onInterceptTouchEvent()以及onTouchEvent()方法。
    touch事件首先会传递到Activity,然后传递到ViewGroup,再到具体的View.

  • 主要方法

dispatchTouchEvent():处理事件的分发,事件多数情况下是由Activity的dispatchTouchEvent开始。

onInterceptTouchEvent():处理事件的拦截,由ViewGroup()提供,意味着在activity中你不能够重写此方法。

onTouchEvent():触摸事件的处理。

  • 流程详解

    1,Touch事件的传入
    开始会由Activity接收事件,接下来事件会传递至Activity的dispatchTouchEvent(),这里默认情况下会是调用

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) 
        return super.dispatchTouchEvent(ev);
    

查看父类的super.dispatchTouchEvent:

    /**
     * Called to process a key shortcut event.
     * You can override this to intercept all key shortcut events before they are
     * dispatched to the window.  Be sure to call this implementation for key shortcut
     * events that should be handled normally.
     * @return True if this event was consumed.
     */
public boolean dispatchTouchEvent(MotionEvent ev) 
    if (ev.getAction() == MotionEvent.ACTION_DOWN) 
        onUserInteraction();
    
    if (getWindow().superDispatchTouchEvent(ev)) 
        return true;
    
    return onTouchEvent(ev);

这里判断条件第一个方法是个空方法,第二个判断条件是系统默认的事件分发机制。所以在activity中,如果手动修改dispatchTouchEvent的返回值,那么事件就会被消费,不在往里传递。

2,从Activity传入外层的ViewGroup

经历了Activity传入事件,第一个走的还是dispatchTouchEvent(),如果手动修改了返回值,事件到此终止,如果使用父类的super.dispatchTouchEvent,那么事件就会传递至onInterceptTouchEvent(),
- 在onInterceptTouchEvent中,:是否拦截本次事件传递

1, return true :那么事件会传递至viewGroup的onTouchEvent中。在   onTouchEvent中,
:return true   事件被消费
:return false  表示viewGroup当中的子控件都不想消费,那么它会直接把本次事件往回传,传至activity中去处理。

2return false: 表示ViewGroup不想拦截,那么事件会继续下发至View

3,事件传递至ViewChild中

dipatchTouchEvent:还是和上面的一样,还是决定是否分发事件,系统的逻辑会自动运行到自己onTouchEvent方法中,如果你主动干预,决定是否分发(手动更改返回值),事件到这里就会终结.

onTouchevent:逻辑和之前的一样,问你是否消费本次事件,

return true :表示消费本次事件,事件结束
return false:表示不消费本次事件,事件会回传给外一层控件,
return super.onTouchEvent(event):是否消费本次事件就要看自己控件类型了(Text,Buttond等,是否消费跟类型有关)

以上是关于Android事件分发机制浅析的主要内容,如果未能解决你的问题,请参考以下文章

Android图解浅析事件拦截机制

Android View的事件分发机制

Android View的事件分发机制

Android View 事件分发机制

Android 事件分发事件分发源码分析 ( ViewGroup 事件传递机制 四 | View 事件传递机制 )

Android事件分发机制五:面试官你坐啊