View生命周期
在View
简介之后,我们已经清楚的认识到View
的基本概念:
-
View
是屏幕上的一块用于绘制和用户交互的矩形区域 -
View
是一个类,该类对象在View
树创建或者我们使用java new
关键词调用构造函数时创建
了解C++
的小伙伴们肯定都听过构造函数和析构函数这两个名词,通过构造函数我们可以生成一个类对象,通过析构函数我们可以完成一个对象的销毁,那么对于同样面对对象的Java
而言,其是否有相似的机制?当然有,在Java
中,我们通过构造函数进行对象创建,而对象的销毁由Java GC
(全称Garbage Collection
,意为垃圾回收)机制自动执行。
View
作为一个对象,当然也有其生命周期,结合View
的函数,我们可以绘制出下图:
上图中函数说明如下表:
函数名称 | 函数说明 | 备注 |
---|---|---|
Constructor | View 类的构造函数,在该构造函数中进行View 对象的初始化,读取attr 属性 |
attr 属性指android:layout_width ,android:layout_height 诸如此类在xml 文件中声明的View 属性值 |
onAttachedToWindow() |
当该View 对象被添加到一个Window 窗体内的时候会调用该函数 |
Window ,View 及Activity 之间关系参见面试之Window&Activity&View |
measure |
View 内部的保留函数,不建议重写,结合父控件在宽高上的约束信息,确认View 的大小, |
该函数内部会调用onMeasure(int widthMeasureSpec, int heightMeasureSpec) 函数 |
onMeasure(int widthMeasureSpec, int heightMeasureSpec) |
测量View 及其内容以用于确定测量后的宽度和高度。 |
由measure 函数调用,应该被View 子类重写,以提供准确有效的测量方式 |
layout |
View 内部的保留函数,不建议重写,进行View 及其子View 的布局,分配View 及其子View 的大小及位置 |
该函数内部会调用onLayout(boolean changed, int left, int top, int right, int bottom) 方法。 |
onLayout(boolean changed, int left, int top, int right, int bottom) |
为View 的子View 指定大小和位置时调用 |
由layout 函数调用,应该被View 子类重写,在该方法中调用各个子View 的layout 方法 |
draw(Canvas canvas) |
View 保留方法,不建议重写。将View 的内容渲染到画布上 |
此时View 必须已完成完成的layout 布局过程,当实现View 子类时,我们可以通过重写onDraw(Canvas canvas) 方法来替代该方法,如果实在需要重写,记得首先调用super.draw(canvas) . |
onDraw(Canvas canvas) |
在该方法中进行自定义绘制,绘制当前需要展示的内容 | 由draw 函数调用,建议在View 子类中重写该方法,在该方法中进行自定义绘制 |
dispatchDraw(Canvas canvas) |
在View 绘制完成后,View 的子View 绘制完成前,系统会调用该方法 |
由draw 函数调用,View 子类中可通过重写该方法,在自身绘制完成后,子View 绘制完成前获取画布,进行某些特殊情形的绘制 |
invalidate() |
UI线程内View 的刷新方法 |
在View 可见状态下,该方法会导致View 调用onDraw(Canvas canvas) 方法进行重绘.注意在子线程进行View 刷新时,我们可以调用postInvalidate() 来实现。 |
requestLayout() |
当View 的某些变化使得layout 布局及measure 过程数据无效时,需要调用该方法 |
该方法会导致View 树重新进行layout 及measure 流程,如果View 树正在布局中,我们不应调用该方法,可以等待当前布局结束或者绘制当前帧完成发生下一次绘制时调用。我们可以通过isInLayout() 来判断View 树是否正在布局中。 |
从上图中,我们可以看出,对View
对象而言,当其完成绘制流程后,自身对用户变为可用状态,此时可以响应用户交互,并根据用户交互进行UI刷新,其中invalidate
和requestLayout
用于线程内部UI刷新,postInvalidate
用于子线程UI刷新。
结合表中描述,对上图进行归类划分我们可以得到新的View
生命周期图:
END!
往期推荐
原文始发于微信公众号(小海编码日记):View绘制系列(2)-View生命周期
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/67974.html