Какие кейсы нужно учесть при распределении ширины детей по контейнеру с абсолютными и относительными размерами
Что проверяют
Это задача на алгоритм раскладки, по сути упрощённый LinearLayout с layout_weight или Row с Modifier.weight в Compose. Проверяют, продумываете ли вы граничные случаи до кода и понимаете ли, как система сама меряет детей. Следом просят добавить минимальную и максимальную ширину.
Как отвечать
Базовый алгоритм линейный: вычесть из ширины контейнера отступы и фиксированные размеры, остаток разделить между относительными детьми пропорционально весу. Так работает и Row в Compose: сначала меряет детей без веса, затем делит оставшееся между взвешенными. Кейсы, которые нужно назвать:
- фиксированных больше, чем влезает: остаток отрицательный. Решите явно: относительные получают ноль, дети обрезаются или контейнер переполняется;
- нет относительных детей: свободное место остаётся пустым или уходит по правилу выравнивания;
- некорректные веса: ноль, отрицательный вес, сумма весов ноль, а значит деление на ноль;
- проценты в сумме больше или меньше 100: нормализовать или считать ошибкой;
- округление: 100 пикселей на троих поровну не делятся. Раздавайте остаточные пиксели по одному, например методом наибольшего остатка, чтобы сумма ширин точно совпала с контейнером;
- отступы:
paddingконтейнера,marginдетей и промежутки между ними вычитаются до распределения; - ограничения min и max: если ребёнок упёрся в предел, его ширина фиксируется, а остаток заново делится между остальными. Это уже итеративный алгоритм;
- неограниченная ширина: в горизонтально прокручиваемом контейнере делить нечего, и веса теряют смысл.
Вспомните и приём из LinearLayout: layout_width="0dp" вместе с весом, чтобы делилось всё пространство, а не остаток после измерения содержимого.
Где спотыкаются
Округляют каждую ширину отдельно. Сумма расходится с контейнером на пару пикселей, и справа появляется щель или обрезанный край.
Не обрабатывают отрицательный остаток. Относительный ребёнок получает отрицательную ширину, и раскладка ломается непредсказуемо.
Путают вес с процентом. Вес задаёт долю свободного места, а не ширины контейнера, поэтому после добавления фиксированного ребёнка доли в пикселях меняются.