Preciso de duas maneiras de mostrar o rótulo vertical no Android:
- Etiqueta horizontal virada 90 graus no sentido anti-horário (letras ao lado)
- Etiqueta horizontal com letras uma embaixo da outra (como uma placa de loja)
Preciso desenvolver widgets personalizados para os dois casos (um caso), posso fazer o TextView para renderizar dessa forma e qual seria uma boa maneira de fazer algo assim se eu precisar ir totalmente personalizado?
android
label
textview
vertical-alignment
Bostone
fonte
fonte
Respostas:
Aqui está minha implementação de texto vertical simples e elegante, estendendo TextView. Isso significa que todos os estilos padrão de TextView podem ser usados, porque é TextView estendido.
Por padrão, o texto girado é de cima para baixo. Se você definir android: gravity = "bottom", ele será desenhado de baixo para cima.
Tecnicamente, ele engana o TextView subjacente ao pensar que é uma rotação normal (trocando largura / altura em alguns lugares), enquanto o desenho é girado. Funciona bem também quando usado em um layout xml.
EDIT: postar outra versão, acima tem problemas com animações. Esta nova versão funciona melhor, mas perde alguns recursos do TextView, como marquise e especialidades semelhantes.
EDITAR versão Kotlin:
fonte
TextView
. Na verdade, os links estão sublinhados, mas não respondem ao clicar.Implementei isso para meu projeto ChartDroid . Criar
VerticalLabelView.java
:E em
attrs.xml
:fonte
Uma maneira de conseguir isso seria:
fonte
\n
após cada caractere ou se você tiver uma fonte de largura fixa, limite a largura de TextView para caber apenas um caractere.Tentei ambas as classes VerticalTextView na resposta aprovada e elas funcionaram razoavelmente bem.
Mas não importa o que eu tentei, não consegui posicionar esses VerticalTextViews no centro do layout de conteúdo (um RelativeLayout que faz parte de um item inflado para um RecyclerView).
FWIW, depois de dar uma olhada, encontrei a classe VerticalTextView do yoog568 no GitHub:
https://github.com/yoog568/VerticalTextView/blob/master/src/com/yoog/widget/VerticalTextView.java
que consegui posicionar conforme desejado. Você também precisa incluir a seguinte definição de atributos em seu projeto:
https://github.com/yoog568/VerticalTextView/blob/master/res/values/attr.xml
fonte
Isso funcionou para mim, muito bem. Quanto às letras que descem verticalmente - não sei.
fonte
Existem algumas coisas menores que precisam ser prestadas atenção.
Depende do conjunto de caracteres ao escolher as formas de rotação ou de caminho. por exemplo, se o conjunto de caracteres de destino for semelhante ao inglês, e o efeito esperado for semelhante,
você pode obter este efeito desenhando cada personagem um por um, sem necessidade de rotação ou caminho.
você pode precisar de rotação ou caminho para obter este efeito.
a parte complicada é quando você tenta renderizar conjuntos de caracteres como o Mongolian. o glifo no Typeface precisa ser girado 90 graus, portanto, drawTextOnPath () será um bom candidato para uso.
fonte
Seguindo a resposta de Pointer Null , fui capaz de centralizar o texto horizontalmente, modificando o
onDraw
método desta forma:Pode ser necessário adicionar uma parte de TextViewamedWidth para centralizar um texto multilinha.
fonte
Você pode simplesmente adicionar ao seu TextView ou outro valor de rotação do View xml. Essa é a maneira mais fácil e para mim funcionando corretamente.
fonte
Minha abordagem inicial para renderizar texto vertical dentro de um LinearLayout vertical foi a seguinte (isso é Kotlin, em Java,
setRoatation
etc.):Como você pode ver, o problema é que o TextView vai verticalmente, mas ainda trata sua largura como se fosse orientado horizontalmente! = /
Assim, a abordagem nº 2 consistia em alternar adicionalmente a largura e a altura manualmente para considerar isso:
No entanto, isso resultou na quebra de etiquetas para a próxima linha (ou sendo cortadas se você
setSingleLine
) após a largura relativamente curta. Novamente, isso se resume a confundir x com y.Minha abordagem nº 3 foi, portanto, envolver o TextView em um RelativeLayout. A ideia é permitir ao TextView qualquer largura que desejar estendendo-o para a esquerda e para a direita (aqui, 200 pixels em ambas as direções). Mas então eu dou ao RelativeLayout margens negativas para garantir que ele seja desenhado como uma coluna estreita. Aqui está meu código completo para esta captura de tela:
Como dica geral, essa estratégia de ter uma visão "manter" outra visão tem sido muito útil para mim no posicionamento das coisas no Android! Por exemplo, a janela de informações abaixo da ActionBar usa a mesma tática!
Para o texto que aparece como um sinal de loja, basta inserir novas linhas após cada caractere, por exemplo
"N\nu\nt\ns"
, será:fonte
Gostei da abordagem de @kostmo. Eu modifiquei um pouco, porque tive um problema - corte o rótulo girado verticalmente quando defini seus parâmetros como
WRAP_CONTENT
. Portanto, um texto não estava totalmente visível.Foi assim que resolvi:
Se você quiser ter um texto de cima para baixo, use o
topToDown(true)
método.fonte