Все мы знаем, насколько важен компонент TextView
. Вероятно, из визуальных элементов он используется чаще всего. Вот почему Google неустанно улучшает этот компонент. В новой версии SDK нам приготовил много вкусностей.
PrecomputedText
Отображение текста — весьма нетривиальная задача, состоящая их множества нюансов: множественные шрифты, межстрочный интервал, расстояние между буквами, направление текста, переносы и т.д. TextView
выполняет немало работы под капотом: чтение файла шрифтов, поиск глифа, определение формы, кеширование слов и т.д. Но самое грустное, что вся эта работа ведётся в UI потоке, что может вызвать просадку фреймрейта.
По факту, оказывается, что эта работа занимает 90% всего времени по настройке. Для решения этой проблемы в Android P был добавлен новый компонент PrecomputedText
(как часть Jetpack), который улучшит работу с текстом. Обратно совместимо до API 14, если использовать PrecomputedTextCompat
.
PrecomputedText
позволяет выполнить всю тяжёлую работу заранее, или даже в фоновом потоке, кешируя результат. Результат PrecomputedText.create(CharSequence, params)
затем может быть задан TextView
. После чего TextView
необходимо выполнить лишь 10% оставшейся работы.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// UI поток val params: PrecomputedText.Params = textView.getTextMetricsParams() val ref = WeakReference(textView) executor.execute { // фоновый поток val text = PrecomputedText.create("Hello", params) val textView = ref.get() textView?.post { // UI поток val textViewRef = ref.get() textViewRef?.text = text } } |
Magnifier
Даже с такой фичей как Smart Text Selection при выборе текста могут возникнуть проблемы. Android P представляет Magnifier для текста для прокачки пользовательского опыта при выделении текста.
Команда хотела, чтобы пользователи испытывали одинаковый опыт во всех приложениях, будь то пользовательские виджеты или где-то ещё. Поэтому и появился виджет Magnifier, который можно применить к любой вьюхе на экране. Виджет Magnifier позволяет задать увеличенную версию любой вьюхи или поверхности, не только текста.
У Magnifier
3 основных метода: show
, update
, dismiss
. К примеру, можно использовать эти методы при обработке тачей, чтобы вести Magnifier вслед за пальцем пользователя:
1 2 3 4 5 6 7 8 9 10 |
fun onTouchEvent(event: MotionEvent): Boolean { when (event.actionMasked) { MotionEvent.ACTION_DOWN -> magnifier.show(event.x, event.y) MotionEvent.ACTION_MOVE -> magnifier.show(event.x, event.y) MotionEvent.ACTION_UP -> magnifier.dismiss() } } |
Smart Linkify
Linkify присутствует с API 1, позволяет добавлять ссылку в текст с помощью регулярок. При этом могли возникать фризы в WebView
. Чтобы улучшить ситуации в sdk были добавлены Smart Linkify, достучаться до которых можно с помощью TextClassifier API.
Smart Linkify использует специальные умные алгоритмы для нахождения объектов в тексте. Основываясь на типе сущности в тексте, затем может предложить соответствующие действия. К примеру, Smart Linkify может распознать номер телефона и предложить на выбор действия: отправить смс, позвонить, добавить в контакты.
Для ускорения всю работу по генерации и назначению ссылок перенесём в фоновый поток:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// UI поток val text: Spannable = ... val request = TextLinks.Request.Builder(text) val ref = WeakReference(textView) executor.execute { // фоновый поток TextClassifier.generateLinks(request).apply(text) val textView = ref.get() textView?.post { // UI поток val textViewRef = ref.get() textViewRef?.text = text } } |