What

绘制流程的三个核心函数onMeasure(测绘控件的大小)onLayout(设置控件相对于父布局的位置)onDraw(控件要绘制什么样的东西),以上的三个步骤全部都是在UI线程中完成操作,今天就主要来进行讨论这三个函数在Android系统的中调用逻辑。

由于60fps帧率的需要,又由于需要在1秒内(1s = 1000ms)完成刷新60帧的操作,因此得出以下结论

1000 / 60 = 16.667 ms/fps

Android会每隔16.667ms进行绘制,因此我们的绘制流程需要在这段时间内完成,不然就会产生我们俗称的卡顿或者ANR(Application Not Responding)。

Why

那么为什么要进行设计这三个流程呢?这就要从Android设计中独有的宽高单位中的Match_Parent、Wrap_Content、声明式大小、三种设计有关系。Match_Parent和Wrap_Content是设置控件大小的两种参数后面简称为Match和Wrap。

onMeasure

Match是填充父控件的大小、Wrap是进行自适应包裹,这两者我们在使用时,例如像LinearLayout等一些控件时发现它的大小系统自动帮我们计算好了,而宽高大小的计算流程便是写在了onMeasure中。

onLayout

例如:LinearLayout通过设置Orientation属性之后进行item在一定方向上的有序排列。FrameLayout则是通过margin、layout_gravity进行设置item针对父布局的层级排列。这些item在布局中逻辑就是在onLayout中完成的。

onDraw

View中的空实现由各个集成自View的控件各自实现逻辑完成。

How