Как стать автором
Обновить

Комментарии 7

Да, static layout нет и его мягко говоря не хватает, но появилась возможность (не так давно насколько я знаю) измерения текста средствами самого compose (и его отрисовки собственно говоря для кастомных контроллов), в ту сторону не смотрели?

Спасибо за наводку! Пока не смотрел. Проект использует немного устаревшую версию Compose (так как версия Compose завязана на версию Kotlin). К сожалению самые новые подходы пока не применить и приходится искать решения исходя из того что есть.

Если найду более изящные способы - дополню статью

Если что имел ввиду вот это, сама возможность появилась недавно, до этого рисовать текст только через нативный canvas можно было.

https://developer.android.com/jetpack/compose/graphics/draw/overview#common-drawing

Спасибо за статью! Думаю что данное решение можно улучшить с помощью SubcomposeLayout иначе мы убьемся об LINE_EXTRA_SPACE при локализации приложения.

Спасибо за замечание! В данном случае локализация скорее всего никак не повлияет. Основная функция `LINE_EXTRA_SPACE` в данном случае – постараться предотвратить перенос строки из-за разницы в ширине символов. Поскольку шрифт может быть не моноширинный, и в случае если мы удаляем скажем символ `a` и добавляем на его место `щ` - может произойти перенос строки. но если же мы уже удалим `aб` и добавим `щ` то переноса строки уже не будет.

Можно конечно попробовать точнее пройти в цикле и по одному удалять символы пока точно не найдем нужную ширину. Но, как указа в статье - это усложнит код, и можем повлиять на производительность

Не очень хорошая практика применять сабкомпозицию для такой вещи. Тут есть примеры как работать с текстом и что оптимальнее https://link.medium.com/JqYqK1uHTzb

У себя реализовывали через onTextLayout и mutableState: делаем кастомный лейаут, в нём меряем текст, сразу после этого у нас mutableState не равен null и используем его для размещения. Всё происходит за один фрейм без лишней рекомпозиции, так как состояние читается при композиции, а при лейаутинге. Подробнее подход можно найти в комменте к той статье.

*так как состояние читается не при композиции, а при лейаутинге

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.