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

  • 时间:
  • 浏览:10

判断view否有有获取焦点,参数hasWindowFocus 对应返回true 和false 还才能用来判断view否有有进出后台。第一次进入当前Activity的然后,返回true,返回上另一个 Activity,返回了false。

4.View生命周期:onAttachedToWindow

二.结果分析

看看源码的解释:

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

关于绘制View的内容,这里就那么 来越多做讨论,然后实战中根据实际清况 来进行完正的分析,继续下另一个 生命周期。

在绘图时还才能明确5个核心的东西(basic components):

很简单的代码,整个布局文件后面 另一个 自定义View,进入有些界面,而是返回。依次打印各个生命周期,亲戚亲戚朋友看一下打印的结果:

一.准备工作

看看源码为什么么么会解释的:

getMeasureWidth()土办法在measure()过程刚开始后就还才能获取到了,而getWidth()土办法要在layout()过程刚开始后才能获取到。在有些复杂化肯能极端的清况 下系统会多次执行measure过程,而是在onMeasure()中去获取View的测量大小得到的是另一个 不准确的值。为了补救该清况 ,最好在onMeasure()的下一阶段即onLayout()中去获取View的宽高。

2. MeasureSpec还才能表示宽和高

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

通过你你是什么 个 值生成新的MeasureSpec

7.View生命周期:onLayout

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

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

当Activity在onCreate加载界面布局资源的然后,亲戚亲戚朋友自定义的View会在xml文件中被加载,而是调用构造函数 MyView(Context context, AttributeSet attrs)来加载自定义View。

第五步:绘制当前视图在滑动时的边框渐变效果,通常亲戚亲戚朋友是必须补救有些步的:If necessary, draw the fading edges and restore layers

瞅一眼源码:

onSizeChanged是在布局文件中自定义View的大小处于改变时被调用。5个参数依次代表变化然后的宽高以及变化然后的宽高。在onMeasure土办法刚开始然后第一次进行调用,将测量的宽高作为前另一个 参数,0作为后另一个 默认参数。

8.View生命周期:onDraw

获取SpecSize

SpecMode一共有某种:

MeasureSpec.UNSPECIFIED,MeasureSpec.EXACTLY , MeasureSpec.AT_MOST , 亲戚亲戚朋友依次看看次要测量模式代表哪些意思:

作为自定义View三部曲的第一步,onMeasure土办法有着极其重要的作用,而是深入理解其中原理对亲戚亲戚朋友然后自定义View开发有着很大的帮助。

Activity生命周期的第另一个 土办法,表示此Activity正在被创建,这里亲戚亲戚朋友主要进行有些初始化的工作。比如调用setContentView()土办法去加载界面布局资源。

当设置View的参数等于MATCH_PARENT的然后,MeasureSpec的specMode就等于EXACTLY,当设置View的参数等于WRAP_CONTENT的然后,MeasureSpec的specMode就等于AT_MOST。而是MATCH_PARENT和WRAP_CONTENT时的specSize都有等于windowSize的,也就原因 根视图一个劲会充满全屏的。而是自定义View在重写onMeasure()的过程中应该手动补救View的宽或高为wrap_content的清况 。

此人 蹩脚的英语水平打上去网上的有些解释,觉得而是理解还是比较靠谱的:

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

5.View生命周期:onMeasure

9.View生命周期:onWindowFocusChanged

至此,亲戚亲戚朋友肯能经历了一次完正的自定义View的生命周期,接下来而是应用到实际项目中,希望能对你有所帮助,下一篇再见~~~

布局文件:

1.Activity生命周期:onCreate

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

onDraw是真正地刚开始对视图进行绘制。

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

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

第二步:保存当前画布的堆栈清况 并在该画布上创建Layer用于绘制View在滑动时的边框渐变效果,通常清况 下亲戚亲戚朋友必须补救有些步:If necessary, save the canvas’ layers to prepare for fading。

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

还才能通过如下土办法分别获取你你是什么 个 值:

6.View生命周期:onSizeChanged

任何另一个 视图都有要经过非常科学的绘制流程后才能显示出来的,每另一个 视图的绘制过程觉得而是另一个 完正的生命周期,亲戚亲戚朋友从这里刚开始入手,并肩学习自定义View。

MeasureSpec.AT_MOST:父容器未能检测出子View所还才能的精确大小,而是指定了另一个 可用大小即specSize ,在该模式下,View的测量大小必须超过SpecSize

写在前面:

然后零零散散写过两篇自定义View的文章,当时而是为了模仿实现某个好看的效果,并必须深入学习过,有些哪些的问题还是一知半解。有些系列的博客主要记录此人 学习自定义View的过程以及心得。

用哪些工具画?

有些小哪些的问题很简单,亲戚亲戚朋友还才能用一支画笔(Paint)来绘图。

当然,亲戚亲戚朋友还才能选则不同颜色的笔,不同大小的笔。

把图画在哪里呢?

亲戚亲戚朋友把图画在了Bitmap上,它保存了所绘图像的各个像素(pixel)。

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

画的内容?

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

为什么么么会画?

调用canvas执行绘图操作。

比如,canvas.drawCircle(),canvas.drawLine(),canvas.drawPath()将亲戚亲戚朋友还才能的图像画出来。

继续看看源码是为什么么么会解释的:

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

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

3.View生命周期:onFinishInflate

获取specMode

参考资料:

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

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

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

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

测量过程刚开始后,视图的大小就肯能测量好了,接下来而是layout的过程了。正如其名字所描述的一样,有些土办法是用于给视图进行布局的,也而是选则视图的具体位置。

还才能注意的是,在setMeasuredDimension()土办法调用然后,亲戚亲戚朋友才能使用getMeasuredWidth()和getMeasuredHeight()来获取视图测量出的准确的深度与深度。

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

MeasureSpec.UNSPECIFIED:父视图不对子视图施加任何限制,子视图还才能得到任意想要的大小,表示子布局想要多大就多大。有些模式一般用作Android系统结构,肯能ListView和ScrollView等滑动控件,很少使用。

int specMode = MeasureSpec.getMode(measureSpec)

int specSize = MeasureSpec.getSize(measureSpec)

自定义View代码:

从后面 这张图片中亲戚亲戚朋友还才能获取到有些重要的信息:

Activity代码:

onAttachedToWindow是在将view绑定到activity所在window时调用,附加到window后,系统程序刚开始进行自定义View的绘制。

源码是而是告诉亲戚亲戚朋友的:

2.View生命周期:onCreate

再来瞅一眼源码:

MeasureSpec测量规范:

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

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

第三步:绘制View的内容:Draw view’s content。有些步是整个draw阶段的核心,在此会调用onDraw()土办法绘制View的内容。 然后亲戚亲戚朋友在分析layout的然后发现onLayout()土办法是另一个 抽象土办法,具体的逻辑由ViewGroup的子类去实现。与之类式,在此onDraw()是另一个 空土办法;肯能每个View所要绘制的内容不同,而是还才能由具体的子View去实现个人所有不同的需求。