View的事件分发机制

2024-03-28  本文已影响0人  黑铁选手
Activity构成

平常所做应用的布局展示在ContentView中。当一个点击事件产生后,事件最先传递给Activity。

源码解析View事件分发机制

当点击屏幕,就产生了一个点击事件(封装成了MotionEvent类),当MotionEvent产生后,系统就会将这个MotionEvent传递给View的层级(这个传递过程称为点击事件分发)。事件分发过程中三个主要方法:

View的事件分发机制。事件以ACTION_DOWN开始以ACTION_UP结束。

一个事件序列:以ACTION_DOWN开始,ACTION_UP结束,中间掺扎着零个或多个ACTION_MOVE事件
当点击事件产生后,事件首先会传递给当前Activity,这时候调用Activity的dispatchTouchEvent()。具体事件的处理是交给activity中的PhoneWindow完成的,然后PhoneWindow再把事件的处理工作交给ViewGroup。
通过for循环倒序遍历(从最上层的子View往内层遍历)ViewGroup的子元素,判断子元素是否能够接收到点击事件,如果能接收到点击事件,则交给子元素处理。

View事件传递规则(先由上而下传递,如果传递到底层没人消费,则由下往上传递,)

事件传递顺序:Activity -> PhoneWindow -> DecorView -> 顶层ViewGroup。
一般在事件传递过程中,只考虑重写ViewGroup的onInterceptTouchEvent()方法。

View的工作流程(View的绘图流程)

View的工作流程,指的就是measure(测量View宽高),layout(确定View位置),draw(绘制View)。

MeasureSpec(每个View都持有)(View的MeasureSpec受自身LayoutParams和父容器的MeasureSpec影响, 对于顶层的DecorView来说,其MeasureSpec由自身的LayoutParams和窗口大小决定的)

View内部类,内部封装View的尺寸(宽高)。作用:在Measure过程中,系统会将View的LayoutParams根据父容器施加的规则转换成对应的MeasureSpec,然后在onMeasure方法中根据这个MeasureSpec来确定View的宽和高。
MeasureSpec的常量,代表了32位的Int值,其中高2位表示SpecMode(测量模式),低30位表示SpecSize(测量大小)。
SpecMode的三种值:

View的Measure流程

measure测量View宽高,流程分为View的measure流程和ViewGroup的measure流程。只不过ViewGroup的measure流程不仅要测量自己,还要遍历其他子View调用其measure()。

View的Layout流程

layout()方法用于确定元素位置。ViewGroup的layout()方法确定子View的位置。View的layout()方法确定自身的位置。
onLayout()是一个空方法,确定位置时根据不同的控件设置不同的值,所以View和ViewGroup中均没有实现onLayout()

View的Draw流程

简单流程如下:

上一篇 下一篇

猜你喜欢

热点阅读