Ответ
Для кастомного расчета размеров View необходимо переопределить метод onMeasure(int widthMeasureSpec, int heightMeasureSpec). В нем вы определяете логику измерения и устанавливаете итоговые размеры через setMeasuredDimension(width, height).
Пример:
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
val desiredWidth = 200
val desiredHeight = 100
val widthMode = MeasureSpec.getMode(widthMeasureSpec)
val widthSize = MeasureSpec.getSize(widthMeasureSpec)
val heightMode = MeasureSpec.getMode(heightMeasureSpec)
val heightSize = MeasureSpec.getSize(heightMeasureSpec)
val width = when (widthMode) {
MeasureSpec.EXACTLY -> widthSize
MeasureSpec.AT_MOST -> min(desiredWidth, widthSize)
else -> desiredWidth
}
val height = ... // аналогично для высоты
setMeasuredDimension(width, height)
}