- TextView
- Программная установка текста
- Атрибуты
- Программная установка фона
- Реагируем на событие onClick
- Многострочный текст
- Увеличиваем интервалы между строками
- Бой с тенью
- Создание ссылок автоматом
- Совет: Используйте полупрозрачность с умом
- Выделить текст для копирования
- Как добавить межстрочный интервал после каждого «\ n» в строке в android?
- Как уменьшить интервал между строками TextView
- 7 ответов
- Как изменить интервал между буквами в Textview?
- Русские Блоги
- Анализ межстрочного интервала Android TextView
- Настройки межстрочного интервала TextView
- android:lineSpacingExtra
- android:lineSpacingMultiplier
- android: lineSpacingExtra и android: lineSpacingMultiplier используются вместе
- setLineSpacing()
- Эффект отображения при различных настройках межстрочного интервала
- Анализ влияния настроек межстрочного интервала
- Получить высоту строки TextView
- Ненормальная ситуация с высотой и интервалом строк TextView
- Анализ исходного кода TextView
TextView
Компонент TextView предназначен для отображения текста без возможности редактирования его пользователем, что видно из его названия (Text — текст, view — просмотр).
Находится в разделе Texts.
TextView — один из самых используемых компонентов. С его помощью пользователю удобнее ориентироваться в программе. По сути, это как таблички: Руками не трогать, По газону не ходить, Вход с собаками воспрещен, Часы работы с 9.00 до 18.00 и т.д., и служит для представления пользователю описательного текста.
Для отображения текста в TextView в файле разметки используется атрибут android:text, например:
Такой подход является нежелательным. Рекомендуется всегда использовать текстовые ресурсы. В будущем эта привычка позволит вам обеспечить многоязыковую поддержку:
Программная установка текста
Программно текст можно задать методом setText():
Атрибуты
Для всех вышеперечисленных атрибутов в классе TextView есть соответствующие методы для чтения или задания соответствующих свойств.
Программно установим размеры текста при помощи setTextSize() с различными единицами измерения.
По умолчанию у компонентов TextView отсутствует фоновый цвет. Чтобы задать цвет, укажите значение Drawable для атрибута android:background. В качестве значения Drawable может использоваться изображение или XML-представление фигуры, включающий ресурс Drawable (поместить в папку res/drawable).
Программная установка фона
В некоторых случаях программисты из-за невнимательности неправильно меняют фон элемента программным способом и удивляются, почему ничего не работает.
Предположим, у вас определён в ресурсах зелёный цвет:
Следующий код будет ошибочным:
Нужно так (два варианта):
Реагируем на событие onClick
Если вы хотите, чтобы TextView обрабатывал нажатия (атрибут android:onClick), то не забывайте также использовать в связке атрибут android:clickable=»true». Иначе работать не будет!
Многострочный текст
Если вы хотите создать многострочный текст в TextView, то используйте символы \n для переноса строк.
Например, в ресурсах:
Обратите внимание, что в тексте также применяется простое форматирование.
Также перенос на новую строку можно задать в коде:
Увеличиваем интервалы между строками
Вы можете управлять интервалом между соседними строчками текста через атрибут android:lineSpacingMultiplier, который является множителем. Установите дробное значение меньше единицы, чтобы сократить интервал или больше единицы, чтобы увеличить интервал между строками.
Бой с тенью
Чтобы оживить текст, можно дополнительно задействовать атрибуты для создания эффектов тени: shadowColor, shadowDx, shadowDy и shadowRadius. С их помощью вы можете установить цвет тени и ее смещение. Во время установки значений вы не увидите изменений, необходимо запустить пример в эмуляторе или на устройстве. В следующем примере я создал тень красного цвета со смещением в 2 пикселя по вертикали и горизонтали. Учтите, что для смещения используются единицы px (пиксели), единицы dp не поддерживаются.
Программный эквивалент — метод public void setShadowLayer (float radius, float dx, float dy, int color):
Создание ссылок автоматом
У TextView есть ещё два интересных свойства Auto link (атрибут autoLink) и Links clickable (атрибут linksClickable), которые позволяют автоматически создавать ссылки из текста.
Выглядит это следующим образом. Предположим, мы присвоим элементу TextView текст Мой сайт: developer.alexanderklimov.ru и применим к нему указанные свойства.
При этом уже на этапе разработки вы увидите, что строка адреса сайта после слов Мой адрес: стала ссылкой. Если вы запустите приложение и нажмете на ссылку, то откроется браузер с указанным адресом. Вам даже не придется писать дополнительный код. Аналогично, если указать номер телефона (параметр phone), то запустится звонилка.
У ссылки есть интересная особенность — при длительном нажатии на ссылку появляется диалоговое окно, позволяющее скопировать ссылку в буфер обмена.
Атрибут autoLink позволяет комбинировать различные виды ссылок для автоматического распознавания: веб-адрес, email, номер телефона.
Цвет ссылки можно поменять через свойство Text color link (XML-атрибут textColorLink), а программно через метод setTextLinkColor().
Программно можно установить ссылки на текст через класс Linkify:
Кроме константы ALL, можно также использовать Linkify.EMAIL_ADDRESSES, Linkify.MAP_ADDRESSES, Linkify.PHONE_NUMBERS. К сожалению, русские адреса не распознаются. В моём случае индекс был распознан как телефонный номер, а город и улица не стали ссылкой.
В таких случаях придётся самостоятельно добавить ссылки в текстах. Например, определим ссылку в ресурсе:
Присвоим созданный ресурс тексту в TextView и запустим пример. Сам текст будет выглядеть как ссылка, но реагировать не будет. Чтобы исправить данную проблему, добавим код:
Ссылки в тексте выглядят не совсем удобными. Есть отдельная библиотека, которая улучшает функциональность. Описание проблем и ссылка на библиотеку есть в статье A better way to handle links in TextView — Saket Narayan.
Совет: Используйте полупрозрачность с умом
Если вам нужно установить текст полупрозрачным, то не используйте атрибут android:alpha:
Дело в том, что такой подход затрачивает много ресурсов при перерисовке.
Атрибут textColor позволяет установить полупрозрачность без потери производительности:
Выделить текст для копирования
По умолчанию, текст в TextView нельзя выделить для копирования. Но в API 11 появилась такая возможность, которая может пригодиться. Делается либо при помощи XML-атрибута android:textIsSelectable, либо через метод setTextIsSelectable().
Добавьте в разметку два компонента TextView и одно текстовое поле EditText для вставки скопированного текста. У первой текстовой метки установим возможность выделения текста декларативно.
Для второго компонента возможность выделения создадим программно.
Сделайте долгий тап на тексте в любом TextView. Увидите стандартные ползунки для выбора длины текста. Скопируйте текст, сделайте длинный тап в EditText и вставьте текст.
Источник
Как добавить межстрочный интервал после каждого «\ n» в строке в android?
Поскольку вопрос четко сформулирован, я хочу добавить небольшой межстрочный интервал после каждого \n , определенного в строке в файле ресурсов в Android.
Допустим, у нас есть строка, определенная в xml следующим образом:
Нормальный вывод при установке на TextView будет таким, как левая сторона этого изображения. Я хочу добиться правой стороны этого изображения.
В xml есть несколько атрибутов, например:
Но эти атрибуты приведут только к следующему:
Поэтому я не хочу добавлять межстрочный интервал после каждой новой строки, потому что ширина строки расходуется, а только после каждого определенного \n .
Любой способ добиться того, чего я хочу, с помощью кода или html? Говоря html, я имею в виду что-то вроде этого, но с некоторыми изменениями после добавления
:
Это больше похоже на то, что я хочу создать много абзацев в TextView с небольшим межстрочным интервалом после каждого абзаца в одной строке. Я думал, что это можно будет сделать через HTML, поэтому я добавил тег html.
Изменить:
Я также не хочу добавлять два разрыва строки, потому что мне нужен только небольшой межстрочный интервал, а объединение двух разрывов строк будет иметь большой межстрочный интервал, чего я не хочу из-за некоторых проблем с дизайном в моем приложении.
Источник
Как уменьшить интервал между строками TextView
Я пытаюсь уменьшить интервал между строками в TextView, установив отрицательное «добавить» в TextView.setLineSpacing(). Он работает хорошо, за исключением того, что нижняя строка усекается.
основная деятельность: (обратите внимание на
это приводит к усечению в нижней части представления (обратите внимание на «g»в нижней строке):
кажется, что проблема связано с неправильным измерением макета. Если я установлю TextView в
есть идеи, как это исправить? Я не против уродливых обходных путей, если это поможет. У меня также есть доступ к FontForge, и я могу изменить файл шрифта, если это необходимо.
7 ответов
Если заполнение не работает, маржа должна выполнять эту работу. Если у вас все еще есть проблема, вы всегда можете применить значение межстрочного интервала к методу onMeasure представления. Вам придется создать пользовательский компонент для этого и расширьте onMeasure.
littleFluffyKittys ответ хорош, но он не работал на некоторых устройствах, если linespacing был установлен через xml
я вычисляю дополнительную высоту, необходимую, сравнивая исходную высоту шрифта с высотой, которую textview вычисляет для строки. Если высота строки меньше высоты шрифта, разница добавляется один раз.
это работает по крайней мере до API 10 propably ниже (просто не тестируется ниже)
я столкнулся с этой же проблемой, но когда я пытался использовать множитель интервала меньше 1.
Я создал подкласс TextView это автоматически исправляет усечение последней строки и не требует установки известного/фиксированного интервала внизу.
просто используйте этот класс, и вы можете использовать его нормально, вам не нужно применять дополнительные интервалы или исправления.
приятно! Это сделает работу, но это никогда не хорошая идея, чтобы поместить значения констант везде, где у нас есть переменные. Вы можете использовать значения lineSpacing, чтобы добавить их в метод onMeasure способом dinamyc. Обратите внимание, что эти значения всегда доступны через «getLineSpacingExtra()» и «getLineSpacingMultiplier()». Или еще проще вы можете получить значение обоих суммированных: «getLineHeight ()».
хотя мне кажется, что это значение должно быть включено в метод onMeasure, вы можете всегда измеряйте точную высоту, которая вам нужна, а затем сделайте простую проверку:
и последнее, вам не нужно передавать контекст в отдельном атрибуте. Если вы посмотрите на свои конструкторы, контекст уже существует. Если вам нужен код вашего компонента, вы можете просто использовать » getContext ()».
Источник
Как изменить интервал между буквами в Textview?
Как изменить межбуквенный интервал в текстовом окне? Поможет ли это, если у меня будет HTML-текст (я не могу использовать веб-просмотр в своем коде).
PS Я использую свой собственный шрифт в текстовом представлении с текстом HTML.
В зависимости от того, какой интервал вам нужен, это может помочь. Это единственное, что удаленно связано с межбуквенным интервалом в TextView.
Изменить: см. Ответ @ JerabekJakub ниже, чтобы узнать об обновленном, лучшем способе сделать это, начиная с api 21 (Lollipop)
Начиная с API 21 существует возможность установки межбуквенного интервала. Вы можете вызвать метод setLetterSpacing или установить его в XML с атрибутом letterSpacing .
Этот ответ основан на ответе Педро, но настроен так, чтобы он также работал, если текстовый атрибут уже установлен:
Если вы хотите использовать его программно:
после API> = 21 существует метод inbuild, предоставляемый TextView, который называется setLetterSpacing
проверьте это для получения дополнительной информации
Я создал собственный класс, который расширяет TextView и решает эту проблему . Посмотрите мой ответ здесь =)
Поскольку Android не поддерживает такую вещь, вы можете сделать это вручную с помощью FontCreator. Есть хорошие возможности для изменения шрифта. Я использовал этот инструмент для создания собственного шрифта, даже если это займет некоторое время, но вы всегда можете использовать его в своих проектах.
Источник
Русские Блоги
Анализ межстрочного интервала Android TextView
Настройки межстрочного интервала TextView
В XML макета есть два параметра для установки межстрочного интервала TextView. Чтобы
Это: android: lineSpacingExtra и android: lineSpacingMultiplier. Чтобы
Его можно установить с помощью метода setLineSpacing () TextView в коде.
android:lineSpacingExtra
android: lineSpacingExtra представляет собой дополнительное значение межстрочного интервала, обычно единицей измерения является dp. Например, android: lineSpacingExtra = ”1dp”. Чтобы
Значение android: lineSpacingExtra может быть отрицательным, десятичным и 0. Если значение положительное, межстрочный интервал увеличивается, если значение отрицательное, межстрочный интервал уменьшается, а если значение равно 0, изменений нет.
android:lineSpacingMultiplier
android: lineSpacingMultiplier представляет собой кратное межстрочному интервалу и не имеет единицы измерения. Например, android: lineSpacingMultiplier = ”1.2”. Чтобы
Значение android: lineSpacingMultiplier может быть любым числом с плавающей запятой. Если значение больше 1.0, это означает увеличение межстрочного интервала, если значение меньше 1.0, это означает уменьшение межстрочного интервала.
android: lineSpacingExtra и android: lineSpacingMultiplier используются вместе
android: lineSpacingExtra и android: lineSpacingMultiplier могут быть установлены вместе в одном и том же TextView. При одновременном использовании он сначала увеличит значение, кратное настройке android: lineSpacingMultiplier, плюс дополнительный интервал, установленный android: lineSpacingExtra.
setLineSpacing()
Прототипом setLineSpacing () является public void setLineSpacing (float add, float mult);
Параметр add представляет значение интервала, которое необходимо увеличить, соответствующее параметру android: lineSpacingExtra. Чтобы
Параметр mult представляет кратное увеличение интервала, соответствующее параметру android: lineSpacingMultiplier.
Эффект отображения при различных настройках межстрочного интервала
Установите различные эффекты отображения android: lineSpacingExtra следующим образом.
Эффект отображения при нормальном межстрочном интервале
Эффект отображения при установке android: lineSpacingExtra = ”2dp”
Эффект отображения при установке android: lineSpacingExtra = ”- 6dp”
Эффект отображения при установке android: lineSpacingExtra = ”- 10dp”
Установите различные эффекты отображения android: lineSpacingMultiplier следующим образом. Чтобы
Эффект отображения при нормальном межстрочном интервале
Эффект отображения при установке android: lineSpacingMultiplier = ”1.2”
Эффект отображения при установке android: lineSpacingMultiplier = ”2.0”
Эффект отображения при установке android: lineSpacingMultiplier = ”0,5”
Эффект отображения, когда установлен android: lineSpacingMultiplier = ”0” (текст не виден, когда он равен 0)
Анализ влияния настроек межстрочного интервала
Измерьте фактический межстрочный интервал под обычным межстрочным интервалом, android: lineSpacingExtra = ”2dp” и android: lineSpacingMultiplier = ”2”, и получите следующие значения
При нормальном межстрочном интервале фактический интервал составляет 12 пикселей.
+ 2dp междустрочный интервал, фактический интервал составляет 18 пикселей
При двукратном увеличении межстрочного интервала фактический интервал составляет 64 пикселя.
Вы можете видеть, что при настройке android: lineSpacingExtra = «2dp» фактический межстрочный интервал также увеличился на 6 пикселей (1dp = 3px на тестовом телефоне), но при настройке android: lineSpacingMultiplier = «2» фактический межстрочный интервал не является обычным межстрочным интервалом. Дважды. Чтобы
Кроме того, если высота текста также включена в измерение, будут получены следующие значения:
При нормальном межстрочном интервале, включая интервал высоты текста, составляет 52 пикселя.
+ 2dp междустрочный интервал, включая интервал высоты текста 58 пикселей
При двухкратном увеличении межстрочного интервала интервал, включая высоту текста, составляет 104 пикселя (здесь используется интервал второй строки, причина будет описана ниже)
В обычном смысле междустрочный интервал относится к расстоянию от низа строки текста до верха следующей строки текста, а высота строки относится к расстоянию от верха строки текста до верха следующей строки текста. Чтобы
Из сравнения видно, что настройки android: lineSpacingExtra и android: lineSpacingMultiplier не влияют напрямую на межстрочный интервал, но влияют на межстрочный интервал через высоту строки. Если задано android: lineSpacingExtra = ”2dp”, высота строки увеличивается на 2dp, а высота текста не изменяется, поэтому межстрочный интервал увеличивается на 2dp. Когда установлено android: lineSpacingMultiplier = ”2”, высота строки увеличивается вдвое, высота текста остается неизменной, а межстрочный интервал увеличивается («высота текста» + «нормальный межстрочный интервал текста»)
Получить высоту строки TextView
TextView предоставляет метод getLineHeight () для получения высоты строки TextView. Чтобы
Для нормального межстрочного интервала высота строки, полученная методом getLineHeight () при настройках android: lineSpacingExtra = «2dp» и android: lineSpacingMultiplier = «2», выглядит следующим образом. Чтобы
Нормальный межстрочный интервал: 52 пикселя
android:lineSpacingExtra=”2dp”:58px
android:lineSpacingMultiplier=”2”:104px
То же, что и фактическое значение измерения.
Ненормальная ситуация с высотой и интервалом строк TextView
Высота каждой строки, фактически отображаемой TextView, не всегда равна высоте строки, полученной методом getLineHeight () (это также означает, что интервал каждой строки не всегда равен высоте строки, полученной методом getLineHeight (), минус высота текста ). Чтобы
Комментарий метода TextView getLineHeight () выглядит следующим образом
Другими словами, если в строке текста есть разметка (я не знаю, что это такое), то высота строки текста может быть больше или меньше высоты, возвращаемой методом getLineHeight (). Кроме того, есть дополнительное пространство для заполнения для первой и последней строк TextView, что приводит к тому, что фактическая высота строки больше, чем высота строки, полученная методом getLineHeight (), а фактический интервал также больше, чем пространство, вычисленное getLineHeight (). Чтобы
Фактическое измерение высоты строки первой строки дает следующие значения. Чтобы
android: lineSpacingMultiplier = «1», «высота первой строки = нормальная высота строки»
android: lineSpacingMultiplier = «2», «высота первой строки = высота нормальной линии + 6 пикселей»
android: lineSpacingMultiplier = «3», «высота первой строки = нормальная высота строки + 12 пикселей»
android: lineSpacingMultiplier = «4», «высота первой строки = высота нормальной линии + 18 пикселей»
То есть «высота первой строки = нормальная высота строки + 6 × (android: lineSpacingMultiplier-1)»
Анализ исходного кода TextView
Чтобы понять, почему параметры android: lineSpacingExtra и android: lineSpacingMultiplier влияют на высоту строки, а не на межстрочный интервал, и почему высота строки первой и последней строк не равна нормальной строке, вам необходимо проанализировать ее с помощью исходного кода TextView. Чтобы
Исходный код конструктора TextView и setLineSpacing () следующий.
То есть настройка android: lineSpacingExtra сохраняется в переменной-члене mSpacingAdd, а настройка android: lineSpacingMultiplier сохраняется в переменной-члене mSpacingMult.
Исходный код TextView getLineHeight () выглядит следующим образом
Вы можете видеть, что TextView вычисляет высоту строки, умножая нормальную высоту на mSpacingMult и добавляя mSpacingAdd. Чтобы
Прослеживая переменные-члены mSpacingAdd и mSpacingMult, было обнаружено, что эти две переменные используются при вызове нового метода построения StaticLayout в методе makeSingleLayout (). Метод generate () вызывается в конструкторе класса StaticLayout, а метод out () вызывается в методе generate (). Вы можете увидеть следующий код в методе out ()
Значение needMultiply определяется как, то есть если установлено любое из android: lineSpacingExtra и android: lineSpacingMultiplier, значение needMultiply истинно.
Затем, если установлено любое из android: lineSpacingExtra и android: lineSpacingMultiplier, будет вычислено дополнительное значение, которое равно (снизу вверх) * (spacingmult-1) + spacingadd с округлением в большую сторону. Чтобы
После этого идет следующий код
Код, связанный с отслеживанием строк [], позволяет увидеть, что строки [] являются ссылкой на mLines, а mLines сохраняет информацию о вертикальном положении каждой строки текста. Каждая обычная строка текста содержит информацию о трех положениях, которые соответствуют трем элементам в mLines ( mColumns = COLUMNS_NORMAL = 3, START = 0, TOP = 1, DESCENT = 2). Чтобы
Следовательно, строки [off + mColumns + TOP] представляют информацию о позиции TOP следующей строки, а строки [off + mColumns + TOP] -lines [off + TOP] могут получить расстояние между верхним положением следующей строки и верхним положением этой строки. , Это высота строки. Очевидно, что lines [off + mColumns + TOP] -lines [off + TOP] = (снизу-вверх) + extra. Если вы проигнорируете процесс округления во время дополнительных вычислений, строки [off + mColumns + TOP] -lines [off + TOP] = (снизу-вверх) + extra = (ниже-вверху) + (ниже-вверху) * (spacingmult- 1) + spacingadd = (снизу вверх) * spacingmult + spacingadd. Это объясняет, почему параметры android: lineSpacingExtra и android: lineSpacingMultiplier влияют на высоту строки, а не на межстрочный интервал. Чтобы
Вы можете увидеть следующий код перед методом out ().
Прослеживая переменную includePad, вы можете видеть, что это значение переменной mIncludePad в TextView, а mIncludePad в TextView имеет фиксированное значение true, поэтому здесь выше = top; будет выполняться, то есть для первой строки текста его позиция выше равна верхней позиции, что может Получить строки [off + mColumns + TOP] -lines [off + TOP] = (снизу-вверх) * spacingmult + spacingadd = (снизу-вверху) * spacingmult + spacingadd. То есть высота строки первой строки текста выше, чем у обычной строки (вверху вверху) * интервал много пикселей. Чтобы
Обратите внимание на настройку выше = top. При измерении высоты первой строки текста ее начальная позиция должна находиться в пустом месте над верхним пикселем текста. В сочетании с указанным выше измерением высоты первой строки можно получить следующие значения. Чтобы
android: lineSpacingMultiplier = «1», «высота первой строки = нормальная высота строки + 6 пикселей»
android: lineSpacingMultiplier = «2», «высота первой строки = высота нормальной линии + 12 пикселей»
android: lineSpacingMultiplier = «3», «высота первой строки = нормальная высота строки + 18 пикселей»
android: lineSpacingMultiplier = «4», «высота первой строки = высота нормальной линии + 24 пикселя»
То есть «высота первой строки — высота обычной строки = 6 × (android: lineSpacingMultiplier)», где 6, очевидно, является значением top-above. Такой же вывод получается в коде.
Источник