Мне нужно 2 способа отображения вертикальной метки в Android:
- Горизонтальная этикетка повернута на 90 градусов против часовой стрелки (буквы сбоку)
- Горизонтальная этикетка с буквами одна под другой (как вывеска магазина)
Нужно ли мне разрабатывать пользовательские виджеты для обоих случаев (один случай), могу ли я сделать так, чтобы TextView отображал именно так, и что было бы хорошим способом сделать что-то подобное, если мне нужно полностью настроить его?
android
label
textview
vertical-alignment
Bostone
источник
источник
Ответы:
Вот моя элегантная и простая реализация вертикального текста, расширяющая TextView. Это означает, что можно использовать все стандартные стили TextView, поскольку это расширенный TextView.
По умолчанию текст повернут сверху вниз. Если вы установите android: gravity = "bottom", то он будет рисоваться снизу вверх.
Технически, базовый TextView вводит в заблуждение, думая, что это нормальное вращение (замена ширины / высоты в нескольких местах), при рисовании его повернутым. Он отлично работает также при использовании в макете xml.
РЕДАКТИРОВАТЬ: при публикации другой версии выше есть проблемы с анимацией. Эта новая версия работает лучше, но теряет некоторые функции TextView, такие как выделение и аналогичные особенности.
ИЗМЕНИТЬ версию Котлина:
источник
TextView
. На самом деле ссылки подчеркнуты, но не реагируют на нажатие.Я реализовал это для своего проекта ChartDroid . Создать
VerticalLabelView.java
:И в
attrs.xml
:источник
Один из способов добиться этого:
источник
\n
после каждого символа, либо, если у вас шрифт фиксированной ширины, ограничьте ширину TextView, чтобы она соответствовала только одному символу.Пробовал оба класса VerticalTextView в утвержденном ответе, и они работали достаточно хорошо.
Но что бы я ни пробовал, мне не удалось разместить эти VerticalTextViews в центре содержащего макета (RelativeLayout, который является частью элемента, раздуваемого для RecyclerView).
FWIW, осмотревшись, я обнаружил на GitHub класс yoog568 VerticalTextView:
https://github.com/yoog568/VerticalTextView/blob/master/src/com/yoog/widget/VerticalTextView.java
который я смог расположить по своему желанию. Вам также необходимо включить в свой проект следующее определение атрибутов:
https://github.com/yoog568/VerticalTextView/blob/master/res/values/attr.xml
источник
Это сработало для меня, просто отлично. Насчет вертикально идущих букв - не знаю.
источник
Есть некоторые мелочи, на которые следует обратить внимание.
Это зависит от кодировки при выборе способов поворота или пути. например, если целевая кодировка похожа на английскую, а ожидаемый эффект выглядит так:
вы можете получить этот эффект, рисуя каждый символ по одному, без поворота или пути.
вам может понадобиться поворот или путь, чтобы получить этот эффект.
сложная часть - это когда вы пытаетесь отобразить кодировку, такую как Mongolian. глиф в гарнитуре необходимо повернуть на 90 градусов, поэтому drawTextOnPath () будет хорошим кандидатом для использования.
источник
После ответа Pointer Null я смог центрировать текст по горизонтали, изменив
onDraw
метод следующим образом:Возможно, вам потребуется добавить часть TextView measureWidth для центрирования многострочного текста.
источник
Вы можете просто добавить в свой TextView или другое значение поворота View xml. Это самый простой способ, и для меня он работает правильно.
источник
Мой первоначальный подход к рендерингу вертикального текста внутри вертикального LinearLayout был следующим (это Kotlin, в Java
setRoatation
и т. Д.):Как вы можете видеть, проблема в том, что TextView идет вертикально, но по-прежнему обрабатывает свою ширину, как если бы он был ориентирован горизонтально! знак равно
Таким образом, подход №2 заключался в дополнительном переключении ширины и высоты вручную, чтобы учесть это:
Однако это приводило к тому, что метки переносились на следующую строку (или обрезались, если вы
setSingleLine
) после относительно небольшой ширины. Опять же, это сводится к путанице x с y.Таким образом, мой подход №3 заключался в том, чтобы обернуть TextView в RelativeLayout. Идея состоит в том, чтобы разрешить TextView любую желаемую ширину, расширив его далеко влево и вправо (здесь 200 пикселей в обоих направлениях). Но затем я даю RelativeLayout отрицательные поля, чтобы убедиться, что он отображается как узкий столбец. Вот мой полный код для этого скриншота:
В качестве общего совета, эта стратегия, при которой представление "удерживает" другое представление, была действительно полезна для меня при позиционировании вещей в Android! Например, информационное окно под панелью действий использует ту же тактику!
Для текста, который выглядит как знак магазина, просто вставляйте новые строки после каждого символа, например,
"N\nu\nt\ns"
будет:источник
Мне понравился подход @kostmo. Я немного изменил его, потому что у меня была проблема - обрезать вертикально повернутую этикетку, когда я установил ее параметры как
WRAP_CONTENT
. Таким образом, текст не был полностью виден.Вот как я это решил:
Если вы хотите, чтобы текст был сверху вниз, используйте
topToDown(true)
метод.источник