关于android:手写自定义View流式布局

视频:价值100w+Android我的项目实战大全:手把手实战,自定义View
原文: https://juejin.cn/post/6969132819855441934

View的生命周期

先onMeasure()测量 、 再onLayout()布局 、最初onDraw()绘制。

在onMeasure()度量时,会先去度量儿子(先走儿子的生命周期),想确认儿子的大小能力确认本人的大小。

自定义View分成两类:

  • 自定义View

个别继承自View,SurfaceView或其余的View。
onMeasure()–> onDraw()都会执行,onLayout()看需要

  • 自定义ViewGroup

继承自ViewGroup或各种Layout
onMeasure()–> onLayout()都会执行, onDraw()看需要

自定义View蕴含什么

布局: onlayout onmeausre/ Layout:viewGroup
显示: onDraw :view: canvas paint matrix clip rect animation path(贝塞尔) line text绘制 frameWork: 交互: onTouchEvent :组合的viewGroup

LayoutParams与MeasureSpec

LayoutParams

LayoutParams(布局参数),也就是xml里定义的

获取

MeasureSpec

MeasureSpec是一个(32位)的int值,高两位示意父容器对 view 的布局上的限度(Mode),低30位示意view的Size



1.unspecified–无限度
2.exactly — 确定的大小
3.at\_most — 最大不超过

实现流式布局

1.继承ViewGroup

2.自定义ViewGroup须要实现onMeasure()度量和onLayout()

3.规范开局,要度量本人的大小得先度量儿子的大小,所以遍历儿子View,去view.measure()

4.儿子的宽高是依据父亲给他的MeasureSpec的Mode + 上本人的LayoutParams算进去的,也就是下面的那个表格。如父亲给的是exactly(确定的大小),儿子又是android:layout\_width=”10dp”,两个都是确定的,那就是10dp

5.取到儿子的宽高

6.儿子的宽高拿到了,那就是计算每行的宽度(并且取最大行宽度)。计算总的高度

7.for循环跑完了,这样每个孩子都度量完了,也晓得了最大的宽高,就能够度量本人的宽高了

8.然而本人的宽高并不只受儿子的影响,还跟父亲给的Mode相干

到此onMeasure()度量完了,接下来开始布局onLayout()

9.因为度量的时候,曾经确定了每一行存哪几个View,把他存到数组里,这样布局的时候简略很多

10.布局onLayout()重要的就是确定上下左右。
所谓的上下左右就是间隔父亲总边框的左上角的地位

所以第一个view的左就是0,右就是 左+view的宽度。(计算时思考view间接的margin就行)
第二个view就是 第一个View的右+第二个view的左….顺次类推(用掉的宽高)

补充

view.getMeasuredWidth()与view.getWidth()

取宽高的时候为啥是view.getMeasuredWidth()。
view.getMeasuredWidth()度量之后这个就有值,然而view.getWidth()得view绘制实现
所以有的时候用view.getWidth()取值的时候是0,然而刷新一下或者下一个绘制时又有值了。

view的Visibility别忘了

是不是暗藏的状况得思考

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理