欢迎光临散文网 会员登陆 & 注册

UI不好,工作难保!自定义View是Android程序员的分水岭?安卓开发升职加

2022-05-18 10:08 作者:房顶上的铝皮水塔  | 我要投稿

ViewGroup的【生命周期流程】:



Q:为什么有些方法会被调用多次?

A:我个人理解因为对于一个ViewGroup进行measure的时候,一个View的大小依赖于measure子View和父View的measureSpec,所以一个View的onLayout onMeasure方法会被调用多次。

课程1自定义FlowLayout:

自定义FlowLayout其实就是自定义一个ViewGroup,我们关注的点主要在onMeasure和onLayout:



onMeasure部分

  1. 测量的关系,ViewGroup在进行measure时,需根据子View的大小调整自身。
  2. 在ViewGroup中onMeasure时,不能直接将从上面传下的measureSpec传给子View。
  3. onMeasure的过程:
  4. 度量孩子 -> for 孩子的height width,通过getChildMeasureSpec方法设置正确的measurespec,然后重新measure
  5. 度量自己 -> setMeasureDimension(),和自身的功能相关,并且最后需要根据MeasureSpec调整

onLayout部分

坐标系

onLayout的四个参数,都是参考ViewGroup(图二)


4. 在后续的layout measure过程中可能会改变的变量需要注意避免在构造函数中初始化,因为构造函数只会调用一次,measure layout会调用多次。

5 . measure过程还是需要注意使用getChildMeasureSpec,同时注意view inflate的问题:

LayoutInflater.inflate(res, parent, false),如果不是这样会导致,根View(temp)无法执行setLayoutParams,这样child.getLayoutParams也会出问题。


面试问题总结:

Q1:MeasureSpec和LayoutParams之间有关联吗?为什么有了LayoutParams还需要MeasureSpec?

View在xml中通过使用android:layout_width等方式告诉父容器布局方式(其实是LayoutParams的xml属性),LayoutParams+父布局决定了MeasureSpec。

Q2:如何将xml中的定义转变成MeasureSpec?

使用getChildMeasureSpec,getChildMeasureSpec在任主席的《安卓开发艺术探索》中有总结。其中第二个参数padding来自parent ,第一个参数是父亲的MeasureSpec,最后一个是子需要的大小。



Q3:为什么需要measure

























UI不好,工作难保!自定义View是Android程序员的分水岭?安卓开发升职加的评论 (共 条)

分享到微博请遵守国家法律