Connect with us

Разработка

Выделение слов в Compose

Мне стало любопытно, как это можно сделать в композите Text, так что давайте разбираться!

Опубликовано

/

     
     

Недавно я наткнулся на несколько ИИ-приложений, переводящих текст в речь, и заметил, что у них есть одна общая особенность в пользовательском интерфейсе — выделение в тексте проговариваемого слова. Мне стало любопытно, как это можно сделать в композите Text, так что давайте разбираться!

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

Чтобы получить информацию о том, как выделить каждое слово, мы можем использовать параметр onTextLayout, который предоставляет нам лямбду для TextLayoutResult. Этот класс содержит множество полезных значений и методов, но нас интересует fun getBoundingBox(offset: Int). Метод возвращает Rect, ограничивающий текстовый символ с заданной позицией смещения. Но мы хотим получить границы целого слова, а не одного символа, поэтому создадим функцию расширения, которая будет возвращать границы Rect для заданного IntRange.

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

Мы разделили текст на список слов и провели итерацию по всем словам, чтобы вычислить их смещение IntRange, которое используется для создания ограничивающего Rect. Затем мы можем просто вернуть список слов с их Rect.

Давайте объединим все это с нашим композитом Text и отрисуем выделение с помощью onDrawBehind. Поскольку для отрисовки выделения нам нужно верхний левый Offset и Size прямоугольника, мы можем использовать API анимации Compose, чтобы сделать его еще лучше.

Вот и все. Вот конечный результат:

Полный код можно найти здесь.

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Telegram

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: