Necesito 2 formas de mostrar la etiqueta vertical en Android:
- Etiqueta horizontal girada 90 grados en sentido antihorario (letras en el lateral)
- Etiqueta horizontal con letras una debajo de la otra (como el letrero de una tienda)
¿Necesito desarrollar widgets personalizados para ambos casos (un caso), puedo hacer que TextView se renderice de esa manera, y cuál sería una buena manera de hacer algo así si necesito ser completamente personalizado?
android
label
textview
vertical-alignment
Bostone
fuente
fuente
Respuestas:
Aquí está mi implementación de texto vertical elegante y simple, extendiendo TextView. Esto significa que se pueden usar todos los estilos estándar de TextView, porque es TextView extendido.
De forma predeterminada, el texto girado es de arriba a abajo. Si configura android: gravity = "bottom", se dibuja de abajo hacia arriba.
Técnicamente, engaña al TextView subyacente al pensar que es una rotación normal (intercambiando ancho / alto en algunos lugares), mientras se dibuja girado. Funciona bien también cuando se usa en un diseño xml.
EDITAR: publicar otra versión, arriba tiene problemas con las animaciones. Esta nueva versión funciona mejor, pero pierde algunas características de TextView, como marquesina y especialidades similares.
EDITAR la versión de Kotlin:
fuente
TextView
. En realidad, los enlaces están subrayados, pero no responden al hacer clic.Implementé esto para mi proyecto ChartDroid . Crear
VerticalLabelView.java
:Y en
attrs.xml
:fuente
Una forma de lograrlos sería:
fuente
\n
después de cada carácter o si tiene una fuente de ancho fijo, limite el ancho de TextView para que quepa solo un carácter.Probé ambas clases de VerticalTextView en la respuesta aprobada y funcionaron razonablemente bien.
Pero no importa lo que intenté, no pude colocar esos VerticalTextViews en el centro del diseño contenedor (un RelativeLayout que es parte de un elemento inflado para un RecyclerView).
FWIW, después de mirar alrededor, encontré la clase VerticalTextView de yoog568 en GitHub:
https://github.com/yoog568/VerticalTextView/blob/master/src/com/yoog/widget/VerticalTextView.java
que pude colocar como deseaba. También debe incluir la siguiente definición de atributos en su proyecto:
https://github.com/yoog568/VerticalTextView/blob/master/res/values/attr.xml
fuente
Esto funcionó para mí, muy bien. En cuanto a las letras que descienden verticalmente, no lo sé.
fuente
Hay algunas cosas menores a las que se debe prestar atención.
Depende del juego de caracteres al elegir las formas de rotación o ruta. por ejemplo, si el juego de caracteres de destino es como el inglés y el efecto esperado parece,
Puede obtener este efecto dibujando cada personaje uno por uno, sin necesidad de rotar o de ruta.
es posible que necesite rotar o trazar para obtener este efecto.
la parte complicada es cuando intentas renderizar un juego de caracteres como mongol. el glifo en el tipo de letra debe rotarse 90 grados, por lo que drawTextOnPath () será un buen candidato para usar.
fuente
Siguiendo la respuesta de Pointer Null , he podido centrar el texto horizontalmente modificando el
onDraw
método de esta manera:Es posible que deba agregar una parte del ancho de medida de TextView para centrar un texto de varias líneas.
fuente
Simplemente puede agregar a su TextView u otro valor de rotación de View xml. Esta es la forma más fácil y para mí funciona correctamente.
fuente
Mi enfoque inicial para representar texto vertical dentro de un LinearLayout vertical fue el siguiente (esto es Kotlin, en uso de Java,
setRoatation
etc.):Como puede ver, el problema es que TextView va verticalmente, ¡pero aún trata su ancho como si estuviera orientado horizontalmente! = /
Por lo tanto, el enfoque n. ° 2 consistió en cambiar adicionalmente el ancho y la altura manualmente para tener en cuenta esto:
Sin embargo, esto dio como resultado que las etiquetas se ajustaran a la siguiente línea (o se recortaran
setSingleLine
) después del ancho relativamente corto. Nuevamente, esto se reduce a confundir x con y.Mi enfoque # 3 fue, por lo tanto, envolver el TextView en un RelativeLayout. La idea es permitir que TextView tenga el ancho que desee extendiéndolo hacia la izquierda y hacia la derecha (aquí, 200 píxeles en ambas direcciones). Pero luego doy los márgenes negativos de RelativeLayout para asegurarme de que se dibuje como una columna estrecha. Aquí está mi código completo para esta captura de pantalla:
Como consejo general, esta estrategia de hacer que una vista "mantenga" otra vista ha sido realmente útil para mí para posicionar cosas en Android. Por ejemplo, la ventana de información debajo de ActionBar usa la misma táctica.
Para el texto que aparece como un letrero de tienda, simplemente inserte nuevas líneas después de cada carácter, por ejemplo
"N\nu\nt\ns"
, será:fuente
Me gustó el enfoque de @kostmo. Lo modifiqué un poco, porque tuve un problema: cortar la etiqueta girada verticalmente cuando configuré sus parámetros como
WRAP_CONTENT
. Por tanto, un texto no era completamente visible.Así es como lo resolví:
Si desea tener un texto de arriba a abajo, utilice el
topToDown(true)
método.fuente