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.
TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta);
fromXDelta establece el desplazamiento de la posición inicial del movimiento en el eje 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 define la posición final de desplazamiento del movimiento en el eje 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 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.
(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... ||
---------------------------+|
| |
| |
| |
+---------------------------+
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:
tXDelta = 700 - 320 = 380
¿Y cómo calculamos el Ancho de pantalla y el Ancho del texto?
Código
Tomando el fragmento de Zarah como punto de partida:
/**
* @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;
}
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.