View绘制02-View生命周期

View生命周期

View简介之后,我们已经清楚的认识到View的基本概念:

  • View是屏幕上的一块用于绘制和用户交互的矩形区域
  • View是一个类,该类对象在View树创建或者我们使用java new关键词调用构造函数时创建

了解C++的小伙伴们肯定都听过构造函数和析构函数这两个名词,通过构造函数我们可以生成一个类对象,通过析构函数我们可以完成一个对象的销毁,那么对于同样面对对象的Java而言,其是否有相似的机制?当然有,在Java中,我们通过构造函数进行对象创建,而对象的销毁由Java GC(全称Garbage Collection,意为垃圾回收)机制自动执行。

View作为一个对象,当然也有其生命周期,结合View的函数,我们可以绘制出下图:
在这里插入图片描述
上图中函数说明如下表:

函数名称函数说明备注
ConstructorView类的构造函数,在该构造函数中进行View对象的初始化,读取attr属性attr属性指android:layout_width,android:layout_height诸如此类在xml文件中声明的View属性值
onAttachedToWindow()当该View对象被添加到一个Window窗体内的时候会调用该函数WindowViewActivity之间关系参见面试之Window&Activity&View
measureView内部的保留函数,不建议重写,结合父控件在宽高上的约束信息,确认View的大小,该函数内部会调用onMeasure(int widthMeasureSpec, int heightMeasureSpec)函数
onMeasure(int widthMeasureSpec, int heightMeasureSpec)测量View及其内容以用于确定测量后的宽度和高度。measure函数调用,应该被View子类重写,以提供准确有效的测量方式
layoutView内部的保留函数,不建议重写,进行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子类重写,在该方法中调用各个子Viewlayout方法
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树重新进行layoutmeasure流程,如果View树正在布局中,我们不应调用该方法,可以等待当前布局结束或者绘制当前帧完成发生下一次绘制时调用。我们可以通过isInLayout()来判断View树是否正在布局中。

从上图中,我们可以看出,对View对象而言,当其完成绘制流程后,自身对用户变为可用状态,此时可以响应用户交互,并根据用户交互进行UI刷新,其中invalidaterequestLayout用于线程内部UI刷新,postInvalidate用于子线程UI刷新。

结合表中描述,对上图进行归类划分我们可以得到新的View生命周期图:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值