- Русские Блоги
- Адаптивный размер официального шрифта TextView в Android
- Масштабируемый TextView
- 1. По умолчанию
- Использование библиотеки поддержки
- 2. Детализация
- Использование библиотеки поддержки
- 3. Предустановленные размеры
- Использование библиотеки поддержки
- Масштабируемый TextView : 1 комментарий
- Динамическое изменение размера шрифта во всем приложении на Android с помощью Configuration.fontScale
- Первоначальная реализация
- Обновленная реализация
Русские Блоги
Адаптивный размер официального шрифта TextView в Android
Обнаружена проблема: когда текст, отображаемый элементом управления, слишком длинный, он может стать неполным на устройстве с маленьким экраном, особенно кнопка, которая не позволяет пропускать текст.
Для такого ленивого человека, как я, конечно, посмотрите, сможет ли кто-нибудь наступить на плечи своих предшественников. Google посмотрел, и я нашел более одного
Взгляните на реализацию
Основной код этих двух примерно одинаков.
Основная идея состоит в том, чтобы переписать TextView, чтобы изменить размер шрифта в соответствии с настройкой при вызове методов onTextChanged и onSizeChanged.
Проблема решается быстро, и она использовалась непосредственно в предыдущих проектах.
Недавно у меня появилось это требование, и я обнаружил, что официальный представитель поддерживает этот TextView с адаптивным размером. Автоматическое изменение размеров TextView
Android 8.0 (API level 26) allows you to instruct a TextView to let the text size expand or contract automatically to fill its layout based on the TextView’s characteristics and boundaries. This setting makes it easier to optimize the text size on different screens with dynamic content.
The Support Library 26.0 provides full support to the autosizing TextView feature on devices running Android versions prior to Android 8.0 (API level 26). The library provides support to Android 4.0 (API level 14) and higher. The android.support.v4.widget package contains the TextViewCompatclass to access features in a backward-compatible fashion.
Эта функция добавлена в TextView Android O. Команда Android считает, что эта функция также должна поддерживаться в предыдущих версиях, поэтому эта функция также реализована в библиотеке поддержки для использования в предыдущих версиях системы.
Установите размер шрифта для автоматической настройки
Есть три способа установить информацию о размере шрифта:
- По умолчанию
- Гранулярность
- Предустановленные размеры
Вызовите функцию setAutoSizeTextTypeWithDefaults (@AutoSizeTextType int autoSizeTextType) в коде и укажите параметр как AUTO_SIZE_TEXT_TYPE_UNIFORM, чтобы установить значение по умолчанию. Если вы не хотите включать автоматическую настройку размера шрифта, вы можете установить для параметра значение AUTO_SIZE_TEXT_TYPE_NONE.
Используйте параметр autoSizeTextType в xml
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:autoSizeTextType=»uniform»
/>
Если вы используете библиотеку поддержки, вы можете использовать атрибуты, определенные в пространстве имен приложения.
Используйте функцию setAutoSizeTextTypeUniformWithConfiguration (int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit), чтобы указать значение размера шрифта. unit — тип размера, определенный TypedValue.
Используйте значение autoSizeTextType в xml, чтобы быть однородным или отсутствовать. Значение по умолчанию — none. Значения autoSizeMinTextSize, autoSizeMaxTextSize и autoSizeStepGranularity являются значениями измерений.
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:autoSizeTextType=»uniform»
android:autoSizeMinTextSize=»12sp»
android:autoSizeMaxTextSize=»112sp»
android:autoSizeStepGranularity=»1sp»
/>
Использовать в библиотеке поддержки
значение по умолчанию
Вызовите функцию setAutoSizeTextTypeUniformWithPresetSizes (int [] presetSizes, int unit) TextView в коде, чтобы установить коллекцию предустановленных размеров шрифта.
Использовать атрибут ресурсов для установки в xml
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:autoSizeTextType=»uniform»
android:autoSizePresetSizes=»@array/autosize_text_sizes»
/>
Использовать в библиотеке поддержки
Это пример, который я использовал в списке, и он работает на устройстве 5.0.
Я использую гранулированный режим
Используемый метод вызова кода поддержки.
Первая функция — это включение функции автоматического изменения размера, а вторая функция — это настройка параметров детального режима: определение максимальной и минимальной настройки шрифта и длины шага каждой настройки шрифта. При настройке размера шрифта система настроит размер шрифта в соответствии с максимальным, минимальным и размером шага и выберет оптимальный размер шрифта.
- Параметр 1: TextView должен быть установлен
- Параметр 2: минимальный размер шрифта для автоматического масштабирования.
- Параметр 3: Максимальный размер шрифта для автоматического масштабирования
- Параметр 4: единица измерения, используемая для параметра 2 и параметра 3. Здесь из-за размера шрифта она обозначена как SP.
Пока очень простой код или конфигурация xml могут реализовать адаптацию размера шрифта TextView, официальное использование также очень скользкое.
был опубликован вАвтоматически изменять размер TextView
Источник
Масштабируемый TextView
Паттерн Material Design рекомендует использовать текст динамического типа вместо маленького размера текста или обрезания текста большого размера. Android упрощает работу с текстом, реализовывая изменения размера TextView.
Android 8.0 API 26 позволяет создавать TextView так, чтобы его размер увеличивался или уменьшался с целью заполнения разметки на основе характеристик и границ TextView. Это позволяет упростить оптимизацию размера текста на разных размерах экранов.
Support Library 26 полностью поддерживает изменение размера TextView на устройствах под управлением Android ниже 8.0. Библиотека работает на версиях от Android 4.0 API 14 и выше. Пакет android.suppport.v4.widget содержит класс TextViewCompat для обратной совместимости.
Перед началом работы нужно подключить библиотеку поддержки. Support Library 26 теперь перенесена в репозиторий Maven Google, поэтому сначала нужно добавить его в файл build.gradle проекта.
Затем в файл build.gradle модуля приложения нужно добавить следующую зависимость:
Вы можете использовать фреймворк или библиотеку поддержки для настройки TextView программно или через XML.
Существует 3 способа настройки TextView:
- По умолчанию
- Детализация
- Предустановленные размеры
Примечание: если вы настроили изменение размера TextView в XML файле, то не рекомендуется использовать значение wrap_content для атрибутов android:width и android:height, так как это может привести к непредвиденному результату.
1. По умолчанию
Значение по умолчанию позволяет масштабировать TextView равномерно по горизонтальной и вертикальной осям.
Чтобы программно задать параметры по умолчанию, нужно нужно вызвать метод setAutoSizeTextTypeWithDefaults(int autoSizeTextType).
В параметры следует передать AUTO_SIZE_TEXT_TYPE_NONE, чтобы выключить функцию изменения размера, или AUTO_SIZE_TEXT_TYPE_UNIFORM, чтобы равномерно масштабировать по горизонтали и вертикали.
Примечание: размеры по умолчанию равны minTextSize = 12sp, maxTextSize = 112sp, детализация 1px.
Чтобы задать параметры по умолчанию в XML, используйте атрибут android:autoSizeTextType со значением none или uniform.
Использование библиотеки поддержки
Чтобы программно задать параметры по умолчанию через библиотеку поддержки, вызовите метод TextViewCompat.setAutoSizeTextTypeWithDefaults(TextView textView, int autoSizeTextType).
В параметры передаются экземпляр TextView, который нужно масштабировать, а также AUTO_SIZE_TEXT_TYPE_NONE, чтобы выключить функцию изменения размера, или AUTO_SIZE_TEXT_TYPE_UNIFORM, чтобы равномерно масштабировать по горизонтали и вертикали.
Чтобы задать параметры по умолчанию через библиотеку поддержки в XML, нужно установить атрибут app:autoSizeTextType со значение none или uniform.
2. Детализация
В этом способе TextView масштабируется равномерно в диапазоне между минимальным и максимальным размером. Приращение принимает размер шага, указанного в атрибуте детализации.
Чтобы определить диапазон размеров и шаг программно, нужно вызвать метод setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit).
В параметры передаются минимальный и максимальный размер, шаг, а также значение из TypedValue.
Чтобы определить диапазон размеров и шаг в XML, нужно установить следующие атрибуты:
- android:autoSizeTextType — установите значение none, чтобы выключить масштабирование и uniform, чтобы включить.
- android:autoSizeMinTextSize, android:autoSizeMaxTextSize, android:autoSizeStepGranularity — установите параметры для масштабирования.
Использование библиотеки поддержки
Чтобы определить диапазон размеров и шаг через библиотеку поддержки программно, нужно вызвать метод TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration (int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit).
Аналогично обычному способу, сюда передаются параметры для масштабирования, а также экземпляр TextView, к которому нужно эти параметры применить.
Чтобы определить диапазон размеров и шаг через библиотеку поддержки в XML, нужно установить атрибуты app:autoSizeTextType, app:autoSizeMinTextSize, app:autoSizeMaxTextSize, app:autoSizeStepGranularity, принимающие аналогичные обычному способу значения.
3. Предустановленные размеры
Предустановленные размеры позволяют вам определить значения, которые TextView выбирает при масштабировании текста.
Чтобы использовать предустановленные размеры программно, вызовите метод setAutoSizeTextTypeUniformWithPresetSizes (int [] presetSizes, int unit).
Здесь в параметры передаётся массив значений, содержащий размеры TextView, а также значение из TypedValue.
Чтобы использовать предустановленные размеры через XML, нужно создать массив значений в ресурсах. Для этого в папке res/values создать файл arrays.xml (или открыть, если он существует), и добавить в него массив.
После этого нужно добавить атрибуты для TextView:
- android:autoSizeTextType — установите значение none, чтобы выключить масштабирование и uniform, чтобы включить.
- android:autoSizePresetSizes — установите сюда массив, который был создан в ресурсах.
Использование библиотеки поддержки
Чтобы использовать предустановленные размеры через библиотеку поддержки программно, используйте метод TextViewCompat.setAutoSizeTextTypeUniformWithPresetSizes(TextView textView, int [] presetSizes, int unit).
Аналогично обычному способу, добавляется массив значений и TypedValue, а также экземпляр TextView, для которого нужно применить масштабирование.
Чтобы использовать предустановленные размеры через библиотеку поддержки в XML, нужно, аналогично обычному способу, создать в ресурсах массив со значениями, затем добавить его в атрибут app:autoSizePresetSizes и указать атрибут app:autoSizeTextType.
Масштабируемый TextView : 1 комментарий
Если TextView содержит длинные слова, то android делает выбор в пользу занять больше свободного пространства, а не в пользу уменьшения шрифта, чтобы уместить всё слово без переносов на новую строку.
Параметр android:breakStrategy=»simple» тоже не помогает.
Получаются вот такие глупые переносы:
Автоматизац
ия
Источник
Динамическое изменение размера шрифта во всем приложении на Android с помощью Configuration.fontScale
Доброго времени суток, уважаемые читатели.
Захотелось мне немного поделиться своими мыслями по поводу android разработки. Возникла у меня задача сделать настройку размера шрифта в приложении, чтобы каждый пользователь сам мог подобрать под себя размер.
Изменение размера шрифта решил делать во всем приложении. Но использовать метод setTextSize в каждом activity не вариант, т.к. в один прекрасный момент появится новое поле и придется на нем вновь прописывать нужный размер. Поэтому, решением было сделать автоматическое изменение во всех местах.
Когда писал данную статью, суть заключалась в следующем: в настройках приложения хранится коэффициент увеличения шрифта. Этот коэффициент применяется на реальный размер шрифта в собственном классе, наследованным от TextView. Но Ganster41 подсказал более хорошее решение. Поэтому сперва будет описание первоначального решение, а в конце будет реализация с помощью Configuration.fontScale.
Первоначальная реализация
Естественно new_coef нужно заполнять динамически. Например при выборе значения на бегунке.
Далее этот коэффициент необходимо считать в нужном месте и с помощью него изменять размер шрифта. Каждый раз считывать его из настроек приложения, при активации того или иного TextView, не совсем хорошее решение. Поэтому коэффициент будем считывать один раз при активации приложения и хранить в глобальной переменной. Для этого добавим новый класс приложения:
Обратите внимание на то, что у метода setTextSize первый параметр по умолчанию = TypedValue.COMPLEX_UNIT_SP. Что означает установку размера шрифта в sp единицах измерения. В нашем же случае используется TypedValue.COMPLEX_UNIT_PX. Этот тип необходимо указывать, чтобы задать размер шрифта в пикселях, т.к. getTextSize возвращает текущий размер в пикселях.
В принципе все подготовительные классы готовы. Осталось в нужном месте разметки вместо TextView указать свой собственный класс MyTextView:
В итоге при открытии activity у данного текста будет изменен размер шрифта на тот, что выбрал пользователь. С EditText все делается аналогично.
Обновленная реализация
Для себя я решил использовать коэффициент размера шрифта от 0.7f до 1.45f с интервалом 0.15f. Т.е. это 6 шагов. Для выбора конкретного значения использую SeekBar.
В нужном месте приложения (в методе onCreate) реализуем обработку выбранного значения на SeekBar:
Обработку выбора значения на бегунке сделали. Теперь необходимо сохранить выбранный результат и сразу же изменить размер шрифта (например по кнопке применять):
Теперь при смене activity будет новый размер шрифта во всех местах приложения. Но на данный момент этот размер будет только до перезагрузки приложения. При открытии приложения произойдет установка размера шрифта того, что установлен в настройках android на устройстве. И соответственно, чтобы в приложении был нужным нам размер, необходимо его переназначить. Для этого мы и сохраняем коэффициент в параметры приложения:
По умолчанию используется значение 2, т.е. в моей формуле это коэффициент увеличения шрифта равный 1 (0,7 + 0,15 * 2 = 1). Данный класс необходимо прописать в манифесте:
В итоге при открытии приложения будет изменен размер шрифта во всех местах. Свою реализацию переделал с первого способа на второй, что позволило не добавлять собственные классы для TextView, EditText и т.п.
Источник