Android开发艺术探索学习笔记4——View的工作原理

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分为四类:

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值