Je souhaite utiliser l'effet de sélection sur un TextView, mais le texte ne défile que lorsque TextView obtient le focus. C'est un problème, car dans mon cas, ce n'est pas possible.
J'utilise:
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
Existe-t-il un moyen pour que TextView fasse toujours défiler son texte? J'ai vu cela se faire dans l'application Android Market, où le nom de l'application défilera dans la barre de titre, même s'il ne reçoit pas le focus, mais je n'ai pas trouvé que cela soit mentionné dans la documentation de l'API.
Réponses:
J'ai été confronté au problème et la solution la plus courte que j'ai trouvée est de créer une nouvelle classe dérivée de TextView. La classe doit remplacer trois méthodes onFocusChanged , onWindowFocusChanged et isFocused pour que le TextView soit entièrement concentré.
la source
Je me suis finalement heurté à ce problème aujourd'hui et je me suis donc lancé
hierarchyviewer
sur l'application Android Market.En regardant le titre sur l'écran de détail d'une application, ils utilisent un ancien
TextView
. L'examen de ses propriétés a montré qu'il n'était pas ciblé, ne pouvait pas l' être et était généralement très ordinaire - à l'exception du fait qu'il était marqué comme sélectionné .Une ligne de code plus tard et je l'ai fait fonctionner :)
Cela a du sens, étant donné ce que dit le Javadoc :
c'est-à-dire que lorsque vous faites défiler un élément dans une vue de liste (comme dans l'application Market), ce n'est qu'alors que le texte maintenant sélectionné commence à défiler. Et puisque ce particulier
TextView
n'est pas focalisable ou cliquable, il ne perdra jamais son état de sélection.Malheureusement, pour autant que je sache, il n'y a aucun moyen de prédéfinir l'état sélectionné à partir du format XML.
Mais le one-liner ci-dessus fonctionne bien pour moi.
la source
TextView
(c'est-à-dire un élément non intégré dans quelque chose de "sélectionnable" comme aListView
) changerait l'état sélectionné.TextView
documentation et jetez un œil àandroid:marqueeRepeatLimit
.Mettez simplement ces paramètres dans votre TextView. Ça marche :)
la source
TranslateAnimation
fonctionne en "tirant" la vue dans une direction d'un montant spécifié. Vous pouvez définir où commencer ce "tirage" et où se terminer.fromXDelta définit le décalage de la position de départ du mouvement dans l'axe X.
toXDelta définit la position de fin de décalage du mouvement dans l'axe X.
Si la largeur de votre texte est plus grande que le module de la différence entre fromXDelta et toXDelta, le texte ne pourra pas se déplacer totalement et de manière contraignante dans l'écran.
Exemple
Supposons que la taille de notre écran soit de 320x240 px. Nous avons un TextView avec un texte qui a une largeur de 700px et nous souhaitons créer une animation qui "tire" le texte afin que nous puissions voir la fin de la phrase.
Tout d'abord, nous réglons
fromXDelta = 0
pour que le mouvement n'ait pas de décalage de départ. Nous devons maintenant déterminer la valeur de toXDelta. Pour obtenir l'effet souhaité, nous devons "extraire" le texte exactement du même px qu'il s'étend hors de l'écran. (dans le schéma est représenté par <<<< X px >>>>) Puisque notre texte a une largeur de 700 et que la zone visible est de 320px (largeur de l'écran), nous définissons:Et comment calculer la largeur de l'écran et la largeur du texte?
Code
Prenant l'extrait de Zarah comme point de départ:
Il existe peut-être des moyens plus simples de le faire, mais cela fonctionne pour toutes les vues auxquelles vous pouvez penser et est réutilisable. Il est particulièrement utile si vous souhaitez animer un TextView dans un ListView sans interrompre les capacités enabled / onFocus du textView. Il défile également en continu même si la vue n'est pas focalisée.
la source
textView.setSelected(true);
ne fonctionne pas dans votre situation?Je ne sais pas si vous avez encore besoin de la réponse, mais j'ai trouvé un moyen simple de le faire.
Configurez votre animation comme ceci:
START_POS_X
,END_POS_X
,START_POS_Y
EtEND_POS_Y
sont desfloat
valeurs, tout enTICKER_DURATION
est un queint
je déclarai avec mes autres constantes.Ensuite, vous pouvez maintenant appliquer cette animation à votre TextView:
Et c'est tout. :)
Mon animation commence sur le côté droit hors écran (300f) et se termine sur le côté gauche hors écran (-300f), avec une durée de 15s (15000).
la source
J'ai écrit le code suivant pour un ListView avec des éléments de texte de sélection. Il est basé sur la solution setSelected décrite ci-dessus. Fondamentalement, j'étends la classe ArrayAdapter et remplace la méthode getView pour sélectionner le TextView avant de le retourner:
la source
C'est la réponse qui apparaît en haut de ma recherche Google, alors j'ai pensé que je pourrais publier une réponse utile ici car j'ai du mal à m'en souvenir assez souvent. Quoi qu'il en soit, cela fonctionne pour moi et nécessite des attributs XML et un onFocusChangeListener.
la source
// xml
// En Java
la source