Android开发艺术探索学习笔记4——View的工作原理 ViewRoot和DecorView
文章图片
关联流程:
文章图片
View的绘制过程:
文章图片
DecorView的内部结构:
文章图片
MeasureSpec
文章图片
通过SpecMode和SpecSize来避免过多的对象内存分配。
SpecMode种类:
UNSPECIFIED:父容器不对View有任何限制,要多大给多大
EXACTILY:父容器检测出View所需要的精确大小。由SpecSize决定大小。
AT_MOST:父容器指定一个可用大小的SpecSize,大小不能超过这个size,具体的由View决定。
在实际使用中:
MATCH_PARENT:精确模式
WRAP_CONTENT:最大模式
固定大小(100dp):精确模式
对应关系:
文章图片
子View最终的MeasureSpec由:父容器的MeasureSpec和自身的LayoutParams来共同决定的。
View的工作流程: 它的工作流程主要指:measure、layout、draw。
Measure过程
View的Measure工作流程: 除了完成自己的测量流程之外好会遍历子元素的measure方法。
文章图片
文章图片
ViewGroup的Measure工作流程: ViewGroup没有定义其测量的过程,这是因为ViewGroup是一个抽象类,不同的ViewGroup子类有着不同的布局特性,这导致他们的测量细节各不相同。
但是它提供了一个叫measureChildren的方法,通过这个方法去测量子元素的宽高。这个方法通过获取子元素的LayoutParams并通过getChildMeasureSpec来创建子元素的MeasureSpec并传递给View的measure方法进行测量。
View的布局过程和Activity的生命周期是不相关的。最好是在ViewTreeObserver中去查看View的参量宽高比较好。
Layout过程
这个过程是ViewGroup特有的,用来确定子元素的位置。
文章图片
onLayout方法是一层层传递的。
文章图片
draw过程
view的绘制分为4步:
1、绘制背景bacgroud.draw(canvas)
2、绘制自己(ondraw)
3、绘制children(dispatchDraw)
4、绘制装饰(onDrawScrollBars)
view的绘制过程的传递是通过dispatchDraw来实现的,它会遍历所有子元素的draw方法。R
如果一个view不希望被绘制的时候可以通过设置setWillNotDraw(true)来完成。
自定义view 自定义View是一个综合的技术体系,涉及到:1、View的层次结构2、时间分发机制3、View工作原理
可将自定义View分为四类:
【Android开发艺术探索学习笔记4——View的工作原理】1、继承View(重写onDraw方法)
2、继承ViewGroup派生特殊的Layout
3、继承特定的View(扩展已有View的功能)
不需要再自己再进行宽高的设置
4、继承特定的ViewGroup
文章图片
不需要自己再进行测绘和布局
自定义View须知
1、直接继承View或者ViewGroup必须在onMeasure中必须特殊处理wrap_comtent
2、padding不像margin,不会自己生效,需要自己处理
3、View本身有post方法,不需要handler进行处理
4、View变得不可见时需要及时停到动画和线程,不然会内存泄漏,可见不可见会有onDetachFromActivity和onAttachToActivity回调。
自定义View没有捷径可走,要多看demo
推荐阅读
- 读书笔记|读书笔记 "起步时最重要的是什么"
- 读书笔记|《白话大数据和机器学习》学习笔记1
- 《乌合之众》读书笔记
- 《Android开发艺术探索》读书笔记-第一章 Activity的生命周期和启动模式
- 第四章 View的工作原理
- Windows|《Win32多线程程序设计》(5)---信号量(Semaphores)
- 读书笔记|[读书笔记]《Android开发艺术探索》第四章笔记
- 读书笔记|《Android开发艺术探索》读书笔记--第4章 View的工作原理
- Android开发艺术探索|Android 开发艺术探索笔记 第四章 View的工作原理