标签:http res 技术分享 过程 enc alt 根据 自定义 原因
布局过程,就是程序在运行时利用布局文件的代码来计算出实际尺寸的过程。
两个阶段:测量阶段和布局阶段。
测量阶段:从上到下递归地调用每个 View 或者 ViewGroup 的 measure() 方法,测量他们的尺寸并计算它们的位置; 布局阶段:从上到下递归地调用每个 View 或者 ViewGroup 的 layout() 方法,把测得的它们的尺寸和位置赋值给它们。
测量阶段,measure()
方法被父 View 调用,在 measure()
中做一些准备和优化工作后,调用 onMeasure()
来进行实际的自我测量。 onMeasure()
做的事,View
和 ViewGroup
不一样:
View
在 onMeasure()
中会计算出自己的尺寸然后保存;ViewGroup
在 onMeasure()
中会调用所有子 View 的 measure()
让它们进行自我测量,并根据子 View 计算出的期望尺寸来计算出它们的实际尺寸和位置(实际上 99.99% 的父 View 都会使用子 View 给出的期望尺寸来作为实际尺寸,原因在下期或下下期会讲到)然后保存。同时,它也会根据子 View 的尺寸和位置来计算出自己的尺寸然后保存;布局阶段,layout()
方法被父 View 调用,在 layout()
中它会保存父 View 传进来的自己的位置和尺寸,并且调用 onLayout()
来进行实际的内部布局。onLayout()
做的事, View
和 ViewGroup
也不一样:
View
的 onLayout()
什么也不做。ViewGroup
在 onLayout()
中会调用自己的所有子 View 的 layout()
方法,把它们的尺寸和位置传给它们,让它们完成自我的内部布局。三类:
onMeasure()
来修改已有的 View
的尺寸;onMeasure()
来全新定制自定义 View
的尺寸;onMeasure()
和 onLayout()
来全新定制自定义 ViewGroup
的内部布局。也就是重写 onMeasure()
来修改已有的 View
的尺寸的具体做法:
onMeasure()
方法,并在里面调用 super.onMeasure()
,触发原有的自我测量;super.onMeasure()
的下面用 getMeasuredWidth()
和 getMeasuredHeight()
来获取到之前的测量结果,并使用自己的算法,根据测量结果计算出新的结果;setMeasuredDimension()
来保存新的结果。View
的尺寸需要在计算的同时,保证计算结果满足父 View 给出的的尺寸限制
layout_
打头的属性)经过父 View 处理计算后的更精确的要求;UNSPECIFIED
:不限制AT_MOST
:限制上限EXACTLY
:限制固定值onMeasure()
,并计算出 View 的尺寸;resolveSize()
来让子 View 的计算结果符合父 View 的限制(当然,如果你想用自己的方式来满足父 View 的限制也行)。onMeasure()
来计算内部布局onLayout()
来摆放子 Viewmeasure()
来计算子 View 的尺寸setMeasuredDimension()
保存计算子 View 的尺寸,关键在于 measure()
方法的两个参数——也就是子 View 的两个 MeasureSpec
的计算。
layout_
打头的属性)和自己的可用空间(自己的尺寸上限 - 已用尺寸)MeasureSpec
中的 mode 而定
MeasureSpec
中的 size
在 onLayout()
里调用每个子 View 的 layout()
,让它们保存自己的位置和尺寸。
标签:http res 技术分享 过程 enc alt 根据 自定义 原因
原文地址:https://www.cnblogs.com/fuyaozhishang/p/8915638.html