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.
TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta);
fromXDelta définit le décalage de la position de départ du mouvement dans 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 la position de fin de décalage du mouvement dans l'axe 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 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.
(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 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:
tXDelta = 700 - 320 = 380
Et comment calculer la largeur de l'écran et la largeur du texte?
Code
Prenant l'extrait 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 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.