Ответ
Расчет размеров View происходит в два этапа: measure и layout.
-
Measure (
onMeasure()):- Определяет желаемые размеры View и ее дочерних элементов.
- Родитель передает ограничения (
MeasureSpec), а View вычисляет свои размеры внутри них.
-
Layout (
onLayout()):- Размещает View и ее дочерние элементы на основе измеренных размеров.
Пример переопределения onMeasure():
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
val desiredWidth = 200
val desiredHeight = 100
setMeasuredDimension(
resolveSize(desiredWidth, widthMeasureSpec),
resolveSize(desiredHeight, heightMeasureSpec)
)
}
Вызовы происходят во время прохода ViewRootImpl при изменении иерархии или запросе requestLayout().