专栏首页小海编码日记View绘制系列(2)-View生命周期

View绘制系列(2)-View生命周期

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刷新,其中invalidaterequestLayout用于线程内部UI刷新,postInvalidate用于子线程UI刷新。

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

END!

往期推荐

View绘制系列(1)-View简介

OpenCV SDK下载及Android Java环境搭建

本文分享自微信公众号 - 小海编码日记(gh_1f87b8c00ede),作者:小海的编码日记

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-10-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • View详解(1)

    好久好久没更新了,不知道大家还有没有在看以前的一些博文,这段时间换了个坑位还是有点小忙呢!鉴于最近工作接触自定义View,Canvas比较多,所以打算开个系列,...

    小海编码日记
  • View绘制系列(3)-自定义View简介

    经过前面两篇文章的介绍,相信大多数同学已经清楚的认识了View,那么我们来看下自定义View这个主题,在小册简介中,我们已经描述了自定义View的目的,同学们还...

    小海编码日记
  • View绘制系列(1)-View简介

    对于初级开发者而言,在面试中,经常会和面试官聊到Android四大组件,聊到Activity,其中回答最纯熟的一句话就是:

    小海编码日记
  • 教你步步为营掌握自定义 View

    国内自定义View的文章汗牛充栋,但是,即使你全部看完它们也未必能掌握这一知识点(实际上,我就几乎看完了所有的国内文章)。为什么?一言以蔽之,你是得其术不明其道...

    非著名程序员
  • View详解(1)

    好久好久没更新了,不知道大家还有没有在看以前的一些博文,这段时间换了个坑位还是有点小忙呢!鉴于最近工作接触自定义View,Canvas比较多,所以打算开个系列,...

    小海编码日记
  • SAP CDS view里association和join的区别

    Association它指明了两个View之间的关系,如果一个View A中定义了Association到另外一个View B时,View A可以把这个Asso...

    Jerry Wang
  • Android:你要了解的自定义View基础概念都在这里了!

    自定义View原理是Android开发者必须了解的基础,在了解自定义View之前,你需要有一定的知识储备。

    Android技术干货分享
  • SAP CDS view里,什么时候用left join,什么时候用association

    版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://jerry.bl...

    Jerry Wang
  • 自定义View基础 - 最易懂的自定义View原理系列(1)

    对于多View的视图,结构是树形结构:最顶层是ViewGroup,ViewGroup下可能有多个ViewGroup或View,如下图:

    Carson.Ho
  • View绘制系列(3)-自定义View简介

    经过前面两篇文章的介绍,相信大多数同学已经清楚的认识了View,那么我们来看下自定义View这个主题,在小册简介中,我们已经描述了自定义View的目的,同学们还...

    小海编码日记

扫码关注云+社区

领取腾讯云代金券