Android自定义View探索(一)—生命周期

  • 时间:
  • 浏览:1
  • 来源:万人牛牛APP下载_万人牛牛官方

时需注意的是,在setMeasuredDimension()措施 调用很久,我们 能够使用getMeasuredWidth()和getMeasuredHeight()来获取视图测量出的准确的强度与强度。

判断view是有无获取焦点,参数hasWindowFocus 对应返回true 和false 可不时需用来判断view是有无进出后台。第一次进入当前Activity的很久,返回true,返回上一一五个Activity,返回了false。

通过你这名五个值生成新的MeasureSpec

3 MeasureSpec由size(大小)和mode(模式)组成

布局文件:

由此可见,视图大小的控制是由父视图、布局文件、以及视图一种并肩完成的,父视图会提供给子视图参考的大小,开发人员可不时需在XML文件中指定视图的大小,最后视图一种才会选着最终的大小。

看看源码怎么 解释的:

7.View生命周期:onLayout

int measureSpec=MeasureSpec.makeMeasureSpec(size, mode);

MeasureSpec测量规范:

系统显示一一五个View,首先时需通过测量(measure)该View来获取其长和宽从而选着显示该View时时需多大的空间。在测量的过程中MeasureSpec贯穿全程,发挥着不可或缺的作用,先瞅一眼源码:

MeasureSpec是一一五个32位的int数据,其中高2位代表SpecMode即一种测量模式,低80位为SpecSize代表在该模式下的规格大小.

可不时需通过如下措施 分别获取你这名五个值:

获取specMode

onAttachedToWindow是在将view绑定到activity所在window时调用,附加到window后,tcp连接开始英文英语 进行自定义View的绘制。

参考资料:

Android视图绘制流程全部解析,带你一步步深入了解View(二)

9.View生命周期:onWindowFocusChanged

一.准备工作

写在前面:

很久零零散散写过两篇自定义View的文章,当时就是为了模仿实现某个好看的效果,并那末 深入学习过,某些现象还是一知半解。某些 系列的博客主要记录人及 学习自定义View的过程以及心得。

2. MeasureSpec可不时需表示宽和高

再来瞅一眼源码:

MeasureSpec.UNSPECIFIED:父视图不对子视图施加任何限制,子视图可不时需得到任意要我的大小,表示子布局要我多大就多大。某些 模式一般用作Android系统组织组织结构,很久ListView和ScrollView等滑动控件,很少使用。

getMeasureWidth()措施 在measure()过程开始英文英语 后就可不时需获取到了,而getWidth()措施 要在layout()过程开始英文英语 很久 够获取到。在某些比较复杂很久极端的请况下系统会多次执行measure过程,太大在onMeasure()中去获取View的测量大小得到的是一一五个不准确的值。为了防止该请况,最好在onMeasure()的下一阶段即onLayout()中去获取View的宽高。

Activity代码:

人及 蹩脚的英语水平加上网上的某些解释,真是那我理解还是比较靠谱的:

onFinishInflate是在自定义View中所有的子控件均被映射成xml后调用。那我View就完成了初始准备工作,Activity也完成了对应布局资源的加载。

第五步:绘制当前视图在滑动时的边框渐变效果,通常我们 是不时需防止某些 步的:If necessary, draw the fading edges and restore layers

onSizeChanged是在布局文件中自定义View的大小所处改变时被调用。五个参数依次代表变化很久的宽高以及变化很久的宽高。在onMeasure措施 开始英文英语 很久第一次进行调用,将测量的宽高作为前一五个参数,0作为后一五个默认参数。

第三步:绘制View的内容:Draw view’s content。某些 步是整个draw阶段的核心,在此会调用onDraw()措施 绘制View的内容。 很久我们 在分析layout的很久发现onLayout()措施 是一一五个抽象措施 ,具体的逻辑由ViewGroup的子类去实现。与之例如,在此onDraw()是一一五个空措施 ;很久每个View所要绘制的内容不同,太大时需由具体的子View去实现人及 不同的需求。

经过测量得出的子View的MeasureSpec是系统给出的一一五个期望值(参考值),我们 也可摒弃系统的某些 测量流程,直接调用setMeasuredDimension( )设置子View的宽和高的测量值。

onLayout是在layout措施 中指定子View的大小和位置。真是就是ViewGroup会调用onLayout()决定子View的显示位置。其中五个参数l, t, r, b分别表示子View相对于父View的左、上、右、下的坐标。

onDraw是真正地开始英文英语 对视图进行绘制。

在Andorid官方文档中将该过程概况成了六步:

5.View生命周期:onMeasure

二.结果分析

int specMode = MeasureSpec.getMode(measureSpec)

在绘图时时需明确五个核心的东西(basic components):

测量过程开始英文英语 后,视图的大小就很久测量好了,接下来就是layout的过程了。正如其名字所描述的一样,某些 措施 是用于给视图进行布局的,也就是选着视图的具体位置。

子View的MeasureSpec由其父容器的MeasureSpec和该子View一种的布局参数LayoutParams并肩决定。

瞅一眼源码:

SpecMode一共有一种:

MeasureSpec.UNSPECIFIED,MeasureSpec.EXACTLY , MeasureSpec.AT_MOST , 我们 依次看看次责测量模式代表哪几种意思:

继续看看源码是怎么 解释的:

8.View生命周期:onDraw

1.Activity生命周期:onCreate

很简单的代码,整个布局文件上方一一五个自定义View,进入某些 界面,因此返回。依次打印各个生命周期,我们 看一下打印的结果:

可用表格来规整各一下MeasureSpec的生成:

MeasureSpec.EXACTLY :父视图希望子视图的大小是specSize中指定的大小,在该模式下,View的测量大小即为SpecSize。

1.MeasureSpec封装了父布局传递给子View的布局要求

源码是那我他不知道们的:

第六步:绘制View的滚动条:Draw decorations (scrollbars for instance)

获取SpecSize

自定义View代码:

int specSize = MeasureSpec.getSize(measureSpec)

当设置View的参数等于MATCH_PARENT的很久,MeasureSpec的specMode就等于EXACTLY,当设置View的参数等于WRAP_CONTENT的很久,MeasureSpec的specMode就等于AT_MOST。因此MATCH_PARENT和WRAP_CONTENT时的specSize总要等于windowSize的,也就愿因分析根视图老要会充满全屏的。太大自定义View在重写onMeasure()的过程中应该手动防止View的宽或高为wrap_content的请况。

第二步:保存当前画布的堆栈请况并在该画布上创建Layer用于绘制View在滑动时的边框渐变效果,通常请况下我们 不时需防止某些 步:If necessary, save the canvas’ layers to prepare for fading。

MeasureSpec.AT_MOST:父容器未能检测出子View所时需的精确大小,因此指定了一一五个可用大小即specSize ,在该模式下,View的测量大小不到超过SpecSize

当Activity在onCreate加载界面布局资源的很久,我们 自定义的View会在xml文件中被加载,因此调用构造函数 MyView(Context context, AttributeSet attrs)来加载自定义View。

Activity生命周期的第一一五个措施 ,表示此Activity正在被创建,这里我们 主要进行某些初始化的工作。比如调用setContentView()措施 去加载界面布局资源。

任何一一五个视图总要要经过非常科学的绘制流程很久 够显示出来的,每一一五个视图的绘制过程真是就是一一五个全部的生命周期,我们 从这里开始英文英语 入手,并肩学习自定义View。

看看源码的解释:

3.View生命周期:onFinishInflate

关于绘制View的内容,这里就太大做讨论,很久实战中根据实际请况来进行全部的分析,继续下一一五个生命周期。

从上方这张图片中我们 可不时需获取到某些重要的信息:

用哪几种工具画?

某些 小现象很简单,我们 时时需一支画笔(Paint)来绘图。

当然,我们 可不时需选着不同颜色的笔,不同大小的笔。

把图画在哪里呢?

我们 把图画在了Bitmap上,它保存了所绘图像的各个像素(pixel)。

也就是说Bitmap承载和呈现了画的各种图形。

画的内容?

根据人及 的需求画圆,画直线,画路径。

怎么 画?

调用canvas执行绘图操作。

比如,canvas.drawCircle(),canvas.drawLine(),canvas.drawPath()将我们 时需的图像画出来。

作为自定义View三部曲的第一步,onMeasure措施 有着极其重要的作用,太大深入理解其中原理对我们 很久自定义View开发有着很大的帮助。

4.View生命周期:onAttachedToWindow

第四步:调用dispatchDraw()绘制View的子View:Draw children

第一步:绘制背景:Draw the background

2.View生命周期:onCreate

6.View生命周期:onSizeChanged

至此,我们 很久经历了一次全部的自定义View的生命周期,接下来就是应用到实际项目中,希望能对你有所帮助,下一篇再见~~~

自定义View系列教程02–onMeasure源码详尽分析