Comments 7
Да, static layout нет и его мягко говоря не хватает, но появилась возможность (не так давно насколько я знаю) измерения текста средствами самого compose (и его отрисовки собственно говоря для кастомных контроллов), в ту сторону не смотрели?
Спасибо за наводку! Пока не смотрел. Проект использует немного устаревшую версию Compose (так как версия Compose завязана на версию Kotlin). К сожалению самые новые подходы пока не применить и приходится искать решения исходя из того что есть.
Если найду более изящные способы - дополню статью
Спасибо за статью! Думаю что данное решение можно улучшить с помощью SubcomposeLayout иначе мы убьемся об LINE_EXTRA_SPACE при локализации приложения.
Спасибо за замечание! В данном случае локализация скорее всего никак не повлияет. Основная функция `LINE_EXTRA_SPACE` в данном случае – постараться предотвратить перенос строки из-за разницы в ширине символов. Поскольку шрифт может быть не моноширинный, и в случае если мы удаляем скажем символ `a` и добавляем на его место `щ` - может произойти перенос строки. но если же мы уже удалим `aб` и добавим `щ` то переноса строки уже не будет.
Можно конечно попробовать точнее пройти в цикле и по одному удалять символы пока точно не найдем нужную ширину. Но, как указа в статье - это усложнит код, и можем повлиять на производительность
Не очень хорошая практика применять сабкомпозицию для такой вещи. Тут есть примеры как работать с текстом и что оптимальнее https://link.medium.com/JqYqK1uHTzb
У себя реализовывали через onTextLayout и mutableState: делаем кастомный лейаут, в нём меряем текст, сразу после этого у нас mutableState не равен null и используем его для размещения. Всё происходит за один фрейм без лишней рекомпозиции, так как состояние читается при композиции, а при лейаутинге. Подробнее подход можно найти в комменте к той статье.
Jetpack Compose: Expandable Text