TranslateAnimation
fonctionne en "tirant" la vue dans une direction d'une quantité spécifiée. Vous pouvez définir le point de départ et le point d'arrivée de cette "traction".
TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta);
fromXDelta définit le décalage de la position de départ du mouvement sur l'axe X.
fromXDelta = 0 //no offset.
fromXDelta = 300 //the movement starts at 300px to the right.
fromXDelta = -300 //the movement starts at 300px to the left
toXDelta définit le décalage de la position finale du mouvement dans l'axe des X.
toXDelta = 0 //no offset.
toXDelta = 300 //the movement ends at 300px to the right.
toXDelta = -300 //the movement ends at 300px to the left.
Si la largeur de votre texte est supérieure au module de la différence entre fromXDelta et toXDelta, le texte ne pourra pas se déplacer totalement et obligatoirement dans l'écran.
Exemple
Supposons que la taille de notre écran soit de 320x240 pxs. Nous avons un TextView avec un texte de 700px de large et nous souhaitons créer une animation qui "tire" le texte pour que nous puissions voir la fin de la phrase.
(screen)
+---------------------------+
|<----------320px---------->|
| |
|+---------------------------<<<< X px >>>>
movement<-----|| some TextView with text that goes out...
|+---------------------------
| unconstrained size 700px |
| |
| |
+---------------------------+
+---------------------------+
| |
| |
<<<< X px >>>>---------------------------+|
movement<----- some TextView with text that goes out... ||
---------------------------+|
| |
| |
| |
+---------------------------+
Tout d'abord, nous définissons fromXDelta = 0
afin que le mouvement n'ait pas de décalage de départ. Nous devons maintenant déterminer la valeur toXDelta. Pour obtenir l'effet désiré, nous devons "tirer" le texte exactement du même px qu'il s'étend hors de l'écran. (dans le schéma, cela est représenté par <<<< X px >>>>) Comme notre texte a une largeur de 700, et que la zone visible est de 320px (largeur de l'écran), nous définissons :
tXDelta = 700 - 320 = 380
Et comment calculer la largeur de l'écran et la largeur du texte ?
Code
En prenant la bribe de Zarah comme point de départ :
/**
* @param view The Textview or any other view we wish to apply the movement
* @param margin A margin to take into the calculation (since the view
* might have any siblings in the same "row")
*
**/
public static Animation scrollingText(View view, float margin){
Context context = view.getContext(); //gets the context of the view
// measures the unconstrained size of the view
// before it is drawn in the layout
view.measure(View.MeasureSpec.UNSPECIFIED,
View.MeasureSpec.UNSPECIFIED);
// takes the unconstrained wisth of the view
float width = view.getMeasuredWidth();
// gets the screen width
float screenWidth = ((Activity) context).getWindowManager().getDefaultDisplay().getWidth();
// perfrms the calculation
float toXDelta = width - (screenWidth - margin);
// sets toXDelta to 0 if the text width is smaller that the screen size
if (toXDelta < 0) {toXDelta = 0; } else { toXDelta = 0 - toXDelta;}
// Animation parameters
Animation mAnimation = new TranslateAnimation(0, toXDelta, 0, 0);
mAnimation.setDuration(15000);
mAnimation.setRepeatMode(Animation.RESTART);
mAnimation.setRepeatCount(Animation.INFINITE);
return mAnimation;
}
Il existe peut-être des méthodes plus simples, mais celle-ci fonctionne pour toutes les vues auxquelles vous pouvez penser et est réutilisable. Elle est particulièrement utile si vous voulez animer un TextView dans une ListView sans rompre les capacités enabled/onFocus du textView. Elle permet également un défilement continu même si la vue n'est pas focalisée.
0 votes
Pour que le marquage fonctionne, le TextView doit être sélectionné, pas focalisé. La mise au point permet la sélection mais pas l'inverse.
1 votes
Essayez alwaysMarqueeTextView stackoverflow.com/a/28806003/3496570
0 votes
Je changerais la bonne réponse pour celle-ci stackoverflow.com/a/3700651/4548520