专栏名称: java那些事
分享java开发中常用的技术,分享软件开发中各种新技术的应用方法。每天推送java技术相关或者互联网相关文章。关注“java那些事”,让自己做一个潮流的java技术人!《java程序员由笨鸟到菜鸟》系列文章火热更新中。
51好读  ›  专栏  ›  java那些事

读Android源码之事件分发机制最全总结

java那些事  · 公众号  · Java  · 2017-04-22 15:05

正文

本文源码来自andorid sdk 22,不同版本会有细微差别,但核心机制是一致的

一.概述

事件分发有多种类型, 本文主要介绍Touch相关的事件分发.

对于View,ViewGroup,Activity都能处理Touch事件, 它们之间处理的先后顺序和方法有所不同.

1.1 View

1.2 ViewGroup

1.3 Activity

二. 分发原理

Input系统—进程交互 文章的小节[3.3]已介绍事件分发过程的前期工作. 当UI主线程收到底层上报的input事件,便会调用InputEventReceiver.dispachInputEvent方法.

2.1 DecorView.dispatchTouchEvent

[-> PhoneWindow.java ::DecorView]

此处cb是指Window的内部接口Callback. 对于Activity实现了Window.Callback接口. 故接下来调用Activity类.

2.2 Activity.dispatchTouchEvent

[-> Activity.java]

如果重写Activity的该方法,则会在分发事件之前拦截所有的触摸事件. 另外此处getWindow()返回的是Activity的mWindow成员变量, 该变量赋值过程是在Activity.attach()方法, 可知其类型为PhoneWindow.

2.2.1 Activity.onTouchEvent

[-> Activity.java]

2.3 superDispatchTouchEvent

[-> PhoneWindow.java]

PhoneWindow的最顶View是DecorView,再交由DecorView处理。而DecorView的父类的父类是ViewGroup,接着调用 ViewGroup.dispatchTouchEvent()方法。为了精简篇幅,有些中间函数调用不涉及关键逻辑,可能会直接跳过。

2.4 ViewGroup.dispatchTouchEvent

2.4.1 onFilterTouchEventForSecurity

根据隐私策略来过滤触摸事件。当返回true,表示继续分发事件;当返回flase,表示该事件应该被过滤掉,不再进行任何分发。

2.4.2 onInterceptTouchEvent







请到「今天看啥」查看全文