Android View绘制(一)生命周期总览

Android View绘制(一)生命周期总览,第1张

概述为了直观表示整个过程,我制作了一张流程图。注意以下只是整个生命周期中比较常用的方法,并不代表所有的过程。当一个Activity收到焦点即将要处于激活状态时,将会被要求绘制它的布局,绘制布局之前的过程在这里不涉及,我们从绘制View开始分析。每个Activity被要求提供一个ViewGroup作

为了直观表示整个过程,我制作了一张流程图。注意以下只是整个生命周期中比较常用的方法,并不代表所有的过程。

当一个Activity收到焦点即将要处于激活状态时,将会被要求绘制它的布局,绘制布局之前的过程在这里不涉及,我们从绘制VIEw开始分析。

每个Activity被要求提供一个VIEwGroup作为VIEw树的根,也就是我们熟悉的setContentVIEw方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14

public voID (@LayoutRes int layoutResID) {
getDelegate().setContentVIEw(layoutResID);
}


public voID (VIEw vIEw) {
getDelegate().setContentVIEw(vIEw);
}


public voID (VIEw vIEw, VIEwGroup.LayoutParams params) {
getDelegate().setContentVIEw(vIEw, params);
}

可以看到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方法返回时,自身的尺寸信息已经确定。所以在根VIEwmeasure方法返回时,所有子VIEw的尺寸信息已经全部确定了。

这个过程需要注意一个VIEw可能不止一次地调用measure方法来对子VIEw进行测量。比如,可能要先传递一个无限制的信息来获取子VIEw想要的尺寸,当子VIEw希望的尺寸过大或过小时,父VIEw需要再次调用measure方法来给予子VIEw一些限制。

第二个是layout过程,这也是一个自顶向下的遍历过程,在这个过程中父VIEw负责按照上一个过程中计算并储存在VIEw中的尺寸信息来正确地放置子VIEw

同时这个过程可以通过调用requestLayout()来重新进行,并且会引起后面步骤的执行,相当于对以这个VIEw为根的VIEw树进行重新布局。


下面就是真正的绘制过程了,也就是VIEwdraw()方法,在draw()方法中,(如果需要)会依次调用如下方法:

drawBackground():在画布上绘制特定的背景onDraw():重写VIEw几乎必重写的一个方法,用于绘制图形dispatchDraw()VIEwGroup会重写这个方法,用于对所有的子VIEw调用draw()方法进行绘制onDrawForeground():用于绘制前景(如果需要)

可以看到如果需要调用上述的方法必定会按照这个顺序进行,也就是说,子VIEw的绘制是在父VIEw绘制之后进行的,而同级VIEw的绘制是根据VIEw在父VIEw中的顺序进行绘制的。

同时这个过程可以通过调用invalIDate()来重新进行,相当于进行某个VIEw的重绘。

原文:大专栏  Android View绘制(一)生命周期总览


总结

以上是内存溢出为你收集整理的Android View绘制(一)生命周期总览全部内容,希望文章能够帮你解决Android View绘制(一)生命周期总览所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1100537.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存