Есть ли способ в Android отрегулировать размер текста в текстовом представлении, чтобы соответствовать месту, которое он занимает?
Например, я использую TableLayout
и добавляю несколько TextView
s в каждую строку. Поскольку я не хочу, чтобы TextView
s оборачивал текст, я скорее вижу, что он уменьшает размер шрифта содержимого.
Любые идеи?
Я пытался measureText
, но так как я не знаю размер столбца, его использование кажется проблематичным. Это код, где я хочу изменить размер шрифта на то, что подходит
TableRow row = new TableRow(this);
for (int i=0; i < ColumnNames.length; i++) {
TextView textColumn = new TextView(this);
textColumn.setText(ColumnNames[i]);
textColumn.setPadding(0, 0, 1, 0);
textColumn.setTextColor(getResources().getColor(R.drawable.text_default));
row.addView(textColumn, new TableRow.LayoutParams());
}
table.addView(row, new TableLayout.LayoutParams());
Ответы:
Решение ниже включает в себя все предложения здесь. Это начинается с того, что было первоначально отправлено Данни. Он использует бинарный поиск как gjpc, но он немного более читабелен. Это также включает исправления ошибок gregm и мои собственные исправления.
источник
<com.example.zengame1.FontFitTextView android:paddingTop="5dip" android:id="@+id/childs_name" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:layout_gravity="center" android:textSize="@dimen/text_size"/>
float hi = this.getHeight() - this.getPaddingBottom() - this.getPaddingTop();
Я написал класс, который расширяет TextView и делает это. Он просто использует measureText, как вы предлагаете. В основном он имеет максимальный размер текста и минимальный размер текста (который можно изменить), и он просто просматривает размеры между ними с шагом 1, пока не найдет самый большой, который подойдет. Не особенно элегантно, но я не знаю другого пути.
Вот код:
источник
Это спидплэйн
FontFitTextView
, но он только уменьшает размер шрифта, если это необходимо для подгонки текста, и в противном случае сохраняет размер шрифта. Это не увеличивает размер шрифта, чтобы соответствовать высоте.Вот пример того, как это можно использовать в XML:
Это позволит сохранить размер шрифта до 60sp, пока текст будет соответствовать ширине. Если текст будет длиннее, он уменьшит размер шрифта. В этом случае
TextView
высота s также изменится из-заheight=wrap_content
.Если вы найдете какие-либо ошибки, не стесняйтесь редактировать.
источник
this.setMeasuredDimension(parentWidth, height);
match_parent
иwrap_content
.text.isEmpty()
будет"".equals(text)
.Вот мое решение, которое работает на эмуляторе и телефонах, но не очень хорошо в редакторе макетов Eclipse. Он основан на коде Килаки, но размер текста получается не из Paint, а из измерения самого вызова TextView
measure(0, 0)
.Класс Java:
Файл атрибута XML:
Проверьте мой GitHub для последней версии этого класса. Я надеюсь, что это может быть полезно для кого-то. Если обнаружена ошибка или если код нуждается в объяснении, не стесняйтесь открыть вопрос на Github.
источник
Большое спасибо https://stackoverflow.com/users/234270/speedplane . Отличный ответ!
Вот улучшенная версия его ответа, которая также заботится о высоте и поставляется с атрибутом maxFontSize для ограничения размера шрифта (был полезен в моем случае, поэтому я хотел поделиться им):
Соответствующий файл /res/values/attr.xml:
Пример:
Чтобы использовать новый
maxFontSize
атрибут, не забудьте добавитьxmlns:res-auto="http://schemas.android.com/apk/res-auto"
как показано в примере.источник
У меня была та же проблема, и я написал класс, который, кажется, работает для меня. По сути, я использовал статический макет, чтобы нарисовать текст на отдельном холсте и повторять его, пока не найду подходящий размер шрифта. Вы можете увидеть класс, размещенный в теме ниже. Я надеюсь, что это помогает.
Автоматическое масштабирование текста TextView для размещения в пределах
источник
Теперь вы можете сделать это без сторонней библиотеки или виджета. Он встроен в TextView на уровне API 26. Добавьте
android:autoSizeTextType="uniform"
егоTextView
и установите его высоту. Вот и все.https://developer.android.com/guide/topics/ui/look-and-feel/autosizing-textview.html
Вы также можете использовать
TextViewCompat
для совместимости.источник
Небольшая модификация onMeasure:
И бинарный поиск по refitText:
источник
trySize *= availableWidth / measured_width
(затем ограничено minTextSize).Я нашел следующее, чтобы работать хорошо для меня. Он не зацикливается и учитывает как высоту, так и ширину. Обратите внимание, что важно указать модуль PX при вызове setTextSize в представлении. Спасибо за подсказку в предыдущем посте за это!
Вот процедура, которую я использую, передавая getPaint () из представления. Строка из 10 символов с «широким» символом используется для оценки ширины независимо от фактической строки.
источник
Работает с модификацией
Вам необходимо установить размер текстового представления следующим образом, потому что в противном случае setTextSize предполагает, что значение указано в единицах SP:
И вам нужно было явно добавить этот код.
источник
Используйте
app:autoSizeTextType="uniform"
для обратной совместимости, потому чтоandroid:autoSizeTextType="uniform"
работают только в API уровня 26 и выше.источник
Я использовал вариант решения Dunni выше, но этот конкретный код не работал для меня. В частности, при попытке использовать объект Paint, заданный так, чтобы он имел признаки объекта Paint представления, а затем вызывал measureText (), он не возвращает то же значение, что и прямой вызов объекта Paint представления. Возможно, существуют некоторые различия в том, как настроены мои взгляды, которые отличают поведение.
Мое решение состояло в том, чтобы напрямую использовать Paint представления, даже при том, что могли быть некоторые потери производительности при изменении размера шрифта для представления многократно.
источник
Я работал над улучшением отличного решения от speedplane, и придумал это. Он управляет высотой, включая установку поля таким образом, чтобы текст был правильно центрирован по вертикали.
Он использует ту же функцию для получения ширины, так как кажется, что она работает лучше всего, но использует другую функцию для получения высоты, поскольку высота нигде не указана. Есть некоторые исправления, которые необходимо внести, но я нашел способ сделать это, хотя и выглядел приятным для глаз.
источник
Google уже сделал эту функцию.
https://developer.android.com/guide/topics/ui/look-and-feel/autosizing-textview.html
источник
У меня была такая боль в моих проектах до тех пор, пока я не нашел эту библиотеку:
Вам просто нужно добавить XML по вашим потребностям, и все готово. Например:
источник
Вдохновленный предыдущими постерами, я хотел поделиться своим решением. Он работает с масштабным коэффициентом, который применяется к предыдущему размеру шрифта, чтобы он соответствовал доступному пространству. Кроме того, чтобы предотвратить непредвиденное поведение метода onDraw TextViews, он просто рисует текст самостоятельно.
источник
источник
Это должно быть простое решение:
источник
Расширьте TextView и переопределите onDraw с помощью приведенного ниже кода. Он сохранит форматное соотношение текста, но увеличит его, чтобы заполнить пространство. Вы можете легко изменить код, чтобы растянуть при необходимости.
источник
Я написал короткий вспомогательный класс, который помещает текстовое представление в пределах определенной ширины и добавляет в конце эллиптический размер «...», если минимальный размер текста не может быть достигнут.
Имейте в виду, что размер текста уменьшается только до тех пор, пока он не уместится или пока не будет достигнут минимальный размер текста. Для тестирования с большими размерами установите текстовое значение на большое число, прежде чем вызывать метод справки.
Требуются пиксели, поэтому, если вы используете значения из измерения, вы можете назвать это так:
Это класс, который я использую:
источник
Если установлено такое преобразование, как allCaps, подход speedplane ошибочен. Я исправил это, приведя к следующему коду (извините, моя репутация не позволяет мне добавлять это как комментарий к решению speedplane):
источник
Я не знаю, это правильный путь или нет, но его работа ... возьмите свое мнение и проверьте OnGlobalLayoutListener () и получите textview linecount, затем установите textSize.
Это очень простой код из нескольких строк ..
источник