Quero usar o efeito de letreiro em um TextView, mas o texto só está sendo rolado quando o TextView obtém o foco. Isso é um problema, porque no meu caso, não pode.
Estou usando:
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
Existe uma maneira de fazer o TextView sempre rolar seu texto? Já vi isso sendo feito no aplicativo Android Market, onde o nome do aplicativo vai rolar na barra de título, mesmo que não receba o foco, mas não consegui encontrar isso sendo mencionado nos documentos da API.
Respostas:
Tenho enfrentado o problema e a solução mais curta que encontrei é criar uma nova classe derivada de TextView. A classe deve substituir três métodos onFocusChanged , onWindowFocusChanged e isFocused para tornar o TextView totalmente focalizado.
fonte
Finalmente me deparei com esse problema hoje e comecei
hierarchyviewer
a usar o aplicativo Android Market.Olhando para o título na tela de detalhes de um aplicativo, eles usam um simples e antigo
TextView
. O exame de suas propriedades mostrou que não estava focado, não podia ser focado e era geralmente muito comum - exceto pelo fato de que foi marcado como selecionado .Uma linha de código depois e eu estava funcionando :)
Isso faz sentido, dado o que o Javadoc diz :
ou seja, quando você rola sobre um item em uma exibição de lista (como no aplicativo Market), somente então o texto agora selecionado começa a rolar. E uma vez que este particular
TextView
não pode ser focalizado ou clicado, ele nunca perderá seu estado de seleção.Infelizmente, até onde eu sei, não há como predefinir o estado selecionado no XML do layout.
Mas o one-liner acima funciona bem para mim.
fonte
TextView
(ou seja, um não incorporado em algo "selecionável" como aListView
) mudaria o estado selecionado.TextView
documentação e dê uma olhada emandroid:marqueeRepeatLimit
.Basta colocar esses parâmetros em seu TextView. Funciona :)
fonte
TranslateAnimation
funciona "puxando" a visualização em uma direção por um valor especificado. Você pode definir onde começar este "puxar" e onde terminar.fromXDelta define o deslocamento da posição inicial do movimento no eixo X.
toXDelta define a posição final do deslocamento do movimento no eixo X.
Se a largura do seu texto for maior que o módulo da diferença entre fromXDelta e toXDelta, o texto não poderá se mover total e obrigatoriamente na tela.
Exemplo
Vamos supor que o tamanho de nossa tela seja 320x240 pxs. Temos um TextView com um texto de 700px de largura e desejamos criar uma animação que “puxa” o texto para que possamos ver o final da frase.
Primeiro, definimos de
fromXDelta = 0
forma que o movimento não tenha um deslocamento inicial. Agora precisamos descobrir o valor toXDelta. Para obter o efeito desejado, precisamos "puxar" o texto exatamente no mesmo px que ele expande para fora da tela. (no esquema é representado por <<<< X px >>>>) Como nosso texto tem largura de 700, e a área visível é de 320 px (largura da tela), definimos:E como calculamos a largura da tela e a largura do texto?
Código
Tomando o Snippet Zarah como ponto de partida:
Pode haver maneiras mais fáceis de fazer isso, mas funciona para todas as visualizações que você possa imaginar e é reutilizável. É especialmente útil se você deseja animar um TextView em um ListView sem quebrar as habilidades enabled / onFocus do textView. Ele também rola continuamente, mesmo se a visualização não estiver focada.
fonte
textView.setSelected(true);
:) não funciona na sua situação?Não sei se você ainda precisa da resposta, mas encontrei uma maneira fácil de fazer isso.
Configure sua animação assim:
START_POS_X
,END_POS_X
,START_POS_Y
EEND_POS_Y
sãofloat
valores, enquanto queTICKER_DURATION
é umint
I declarado com minhas outras constantes.Então agora você pode aplicar esta animação ao seu TextView:
E é isso. :)
Minha animação começa no lado direito fora da tela (300f) e termina no lado esquerdo fora da tela (-300f), com duração de 15s (15.000).
fonte
Escrevi o seguinte código para um ListView com itens de texto de letreiro. Ele é baseado na solução setSelected descrita acima. Basicamente, estou estendendo a classe ArrayAdapter e substituindo o método getView para selecionar o TextView antes de retorná-lo:
fonte
Esta é a resposta que aparece no topo da minha pesquisa no Google, então pensei que poderia postar uma resposta útil aqui, já que tenho dificuldade em lembrar isso com bastante frequência. De qualquer forma, isso funciona para mim e requer atributos XML e um onFocusChangeListener.
fonte
// xml
// Em Java
fonte