Расскажите про реализацию метода View.onMeasure()

onMeasure() — метод, необходимый, чтобы определить размеры View и его “детей”. Данный метод должен быть переопределен таким образом, чтобы быстро и точно возвращать размеры View и его “детей”. Так же есть установки на View от его родителей, который накладывают дополнительные ограничения.

Сама же реализация выглядит примерно так:

  1. На вход onMeasure() поступает два аргумента: widthMesureSpec и heightMesureSpec.

В каждом из них закодировано два значения, сам размер и режим. Режим закодирован с помощью сдвига на 30 битов. Всего есть три режима:

MeasureSpec.UNSPECIFIED = 0 — родитель не наложил никаких ограничений по размеру на View

MeasureSpec.EXACTLY = 1 — родитель задал точные размеры View

MeasureSpec.AT_MOST = 2 — родитель задал максимальный размер View

2. Вычисление самих размеров

Учитывая поступившие аргументы и ограничения от родителя необходимо расчитать размеры View

3. Вызвать метод setMeasuredDimension()/вызвать super.onMeasure(), чтобы передать вычисленные значения дальше. Если этого не сделать то вылетит исключение IllegalStateException

Поделиться уроком

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *