为了直观表示整个过程,我制作了一张流程图。注意以下只是整个生命周期中比较常用的方法,并不代表所有的过程。
当一个Activity
收到焦点即将要处于激活状态时,将会被要求绘制它的布局,绘制布局之前的过程在这里不涉及,我们从绘制VIEw
开始分析。
每个Activity
被要求提供一个VIEwGroup
作为VIEw树的根,也就是我们熟悉的setContentVIEw
方法。
1 |
|
可以看到setContentVIEw
拥有三种形式,可以直接传入VIEw
、传入一个layout
资源文件,或传入一个VIEw
文件和一个用于提供参数的LayoutParams
对象。
整个过程将从这个根VIEw
开始,并遍历它的子VIEw
来逐一绘制,每个VIEwGroup
承担了要求它的子VIEw
进行绘制的责任,每个VIEw
承担了绘制自身的责任。并且父VIEw
会在子VIEw
完成绘制之前进行绘制,同级的VIEw
将以它们出现在树中的顺序进行绘制。
首先调用的当然是VIEw
的构造函数,构造函数分为两种,一种供代码创建的VIEw
使用,另一种是由layout
文件生成的VIEw
使用,区别在于后者会从layout
文件中读入所有的属性,前者的属性则需要在代码中设置。
另外后者在所有的子VIEw
都生成完毕之后会回调onFinishInflate
方法。
在正式绘制之前要进行两个过程(布局机制[layout mechanism]):
首先是measure
过程。这是一个自顶向下的过程,父VIEw
将期望尺寸传递给子VIEw
,子VIEw
需要根据这一信息确定自己的尺寸,并且保证这一尺寸满足父VIEw
对其的要求,在子VIEw
确定自己尺寸的过程中也要向它的子VIEw
传递信息,就这样递归地确定自己的尺寸信息并储存在自身中,保证在measure
方法返回时,自身的尺寸信息已经确定。所以在根VIEw
的measure
方法返回时,所有子VIEw
的尺寸信息已经全部确定了。
这个过程需要注意一个VIEw
可能不止一次地调用measure
方法来对子VIEw
进行测量。比如,可能要先传递一个无限制的信息来获取子VIEw
想要的尺寸,当子VIEw
希望的尺寸过大或过小时,父VIEw
需要再次调用measure
方法来给予子VIEw
一些限制。
第二个是layout
过程,这也是一个自顶向下的遍历过程,在这个过程中父VIEw
负责按照上一个过程中计算并储存在VIEw
中的尺寸信息来正确地放置子VIEw
。
同时这个过程可以通过调用requestLayout()
来重新进行,并且会引起后面步骤的执行,相当于对以这个VIEw
为根的VIEw
树进行重新布局。
下面就是真正的绘制过程了,也就是VIEw
的draw()
方法,在draw()
方法中,(如果需要)会依次调用如下方法:
drawBackground()
:在画布上绘制特定的背景onDraw()
:重写VIEw
几乎必重写的一个方法,用于绘制图形dispatchDraw()
:VIEwGroup
会重写这个方法,用于对所有的子VIEw
调用draw()
方法进行绘制onDrawForeground()
:用于绘制前景(如果需要)可以看到如果需要调用上述的方法必定会按照这个顺序进行,也就是说,子VIEw
的绘制是在父VIEw
绘制之后进行的,而同级VIEw
的绘制是根据VIEw
在父VIEw
中的顺序进行绘制的。
同时这个过程可以通过调用invalIDate()
来重新进行,相当于进行某个VIEw
的重绘。
原文:大专栏 Android View绘制(一)生命周期总览
总结
以上是内存溢出为你收集整理的Android View绘制(一)生命周期总览全部内容,希望文章能够帮你解决Android View绘制(一)生命周期总览所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)