Quiero usar el efecto de marco en un TextView, pero el texto solo se desplaza cuando el TextView se enfoca. Eso es un problema, porque en mi caso, no puede.
Estoy usando:
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
¿Hay alguna manera de que TextView siempre se desplace por su texto? He visto que esto se hace en la aplicación Android Market, donde el nombre de la aplicación se desplazará en la barra de título, incluso si no recibe el foco, pero no pude encontrar que esto se menciona en los documentos de la API.
Respuestas:
He estado enfrentando el problema y la solución más corta que se me ha ocurrido es crear una nueva clase derivada de TextView. La clase debe anular tres métodos onFocusChanged , onWindowFocusChanged e isFocused para hacer que TextView esté todo enfocado.
fuente
Finalmente me encontré con este problema hoy y encendí
hierarchyviewer
la aplicación Android Market.Al mirar el título en la pantalla de detalles de una aplicación, usan un antiguo
TextView
. El examen de sus propiedades mostró que no estaba enfocado, no podía enfocarse y, en general, era muy común, excepto por el hecho de que estaba marcado como seleccionado .Una línea de código más tarde y lo tenía funcionando :)
Esto tiene sentido, dado lo que dice el Javadoc :
es decir, cuando se desplaza sobre un elemento en una vista de lista (como en la aplicación Market), solo entonces el texto seleccionado ahora comienza a desplazarse. Y dado que este en particular
TextView
no se puede enfocar ni hacer clic, nunca perderá su estado de selección.Desafortunadamente, hasta donde yo sé, no hay forma de preestablecer el estado seleccionado desde el XML de diseño.
Pero la frase de arriba funciona bien para mí.
fuente
TextView
(es decir, uno no incrustado en algo "seleccionable" como aListView
) cambiaría el estado seleccionado.TextView
documentación y échale un vistazoandroid:marqueeRepeatLimit
.Simplemente coloque estos parámetros en su TextView. Funciona :)
fuente
TranslateAnimation
funciona "tirando" de la Vista en una dirección en una cantidad específica. Puede establecer dónde comenzar este "tirón" y dónde terminar.fromXDelta establece el desplazamiento de la posición inicial del movimiento en el eje X.
toXDelta define la posición final de desplazamiento del movimiento en el eje X.
Si el ancho de su texto es mayor que el módulo de la diferencia entre fromXDelta y toXDelta, el texto no podrá moverse total y obligatoriamente dentro de la pantalla.
Ejemplo
Supongamos que nuestro tamaño de pantalla es de 320x240 px. Tenemos un TextView con un texto que tiene un ancho de 700px y deseamos crear una animación que "tire" del texto para que podamos ver el final de la frase.
Primero configuramos
fromXDelta = 0
para que el movimiento no tenga un desplazamiento inicial. Ahora necesitamos calcular el valor de toXDelta. Para lograr el efecto deseado, necesitamos "tirar" del texto exactamente con el mismo px que se extiende fuera de la pantalla. (en el esquema está representado por <<<< X px >>>>) Dado que nuestro texto tiene un ancho de 700, y el área visible es de 320 px (ancho de pantalla), establecemos:¿Y cómo calculamos el Ancho de pantalla y el Ancho del texto?
Código
Tomando el fragmento de Zarah como punto de partida:
Puede haber formas más fáciles de realizar esto, pero esto funciona para todas las vistas que pueda imaginar y es reutilizable. Es especialmente útil si desea animar un TextView en un ListView sin romper las capacidades habilitadas / onFocus del textView. También se desplaza continuamente incluso si la vista no está enfocada.
fuente
textView.setSelected(true);
no funciona en su situación?No sé si todavía necesita la respuesta, pero encontré una manera fácil de hacerlo.
Configura tu animación así:
START_POS_X
,END_POS_X
,START_POS_Y
YEND_POS_Y
sonfloat
los valores, mientras queTICKER_DURATION
es unint
declaré con mis otras constantes.Entonces ahora puede aplicar esta animación a su TextView:
Y eso es. :)
Mi animación comienza en el lado derecho fuera de la pantalla (300f) y termina en el lado izquierdo fuera de la pantalla (-300f), con una duración de 15 s (15000).
fuente
Escribí el siguiente código para un ListView con elementos de texto de marquesina. Se basa en la solución setSelected descrita anteriormente. Básicamente, estoy extendiendo la clase ArrayAdapter y anulo el método getView para seleccionar TextView antes de devolverlo:
fuente
Esta es la respuesta que aparece en la parte superior de mi búsqueda de Google, así que pensé que podría publicar una respuesta útil aquí, ya que me cuesta recordar esto con bastante frecuencia. De todos modos, esto funciona para mí y requiere atributos XML y A un onFocusChangeListener.
fuente
// xml
// En Java
fuente