onMeasure() — метод, необходимый, чтобы определить размеры View и его “детей”. Данный метод должен быть переопределен таким образом, чтобы быстро и точно возвращать размеры View и его “детей”. Так же есть установки на View от его родителей, который накладывают дополнительные ограничения.
Сама же реализация выглядит примерно так:
- На вход onMeasure() поступает два аргумента: widthMesureSpec и heightMesureSpec.
В каждом из них закодировано два значения, сам размер и режим. Режим закодирован с помощью сдвига на 30 битов. Всего есть три режима:
MeasureSpec.UNSPECIFIED = 0 — родитель не наложил никаких ограничений по размеру на View
MeasureSpec.EXACTLY = 1 — родитель задал точные размеры View
MeasureSpec.AT_MOST = 2 — родитель задал максимальный размер View
2. Вычисление самих размеров
Учитывая поступившие аргументы и ограничения от родителя необходимо расчитать размеры View
3. Вызвать метод setMeasuredDimension()/вызвать super.onMeasure(), чтобы передать вычисленные значения дальше. Если этого не сделать то вылетит исключение IllegalStateException