TranslateAnimation
funziona "tirando" la vista in una direzione di una quantità specificata. È possibile impostare dove iniziare questo "tirare" e dove finire.
TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta);
fromXDelta imposta l'offset della posizione iniziale del movimento nell'asse 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 definisce la posizione finale di offset del movimento nell'asse 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.
Se la larghezza del tuo testo è maggiore del modulo della differenza tra fromXDelta e toXDelta, il testo non sarà in grado di muoversi totalmente e compeltamente all'interno dello schermo.
Esempio
Supponiamo che le dimensioni dello schermo siano 320x240 px. Abbiamo un TextView con un testo che ha una larghezza di 700px e desideriamo creare un'animazione che "tira" il testo in modo da poter vedere la fine della 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... ||
---------------------------+|
| |
| |
| |
+---------------------------+
Per prima cosa impostiamo in fromXDelta = 0
modo che il movimento non abbia un offset iniziale. Ora dobbiamo calcolare il valore toXDelta. Per ottenere l'effetto desiderato, dobbiamo "tirare" il testo con lo stesso identico px che si estende fuori dallo schermo. (nello schema è rappresentato da <<<< X px >>>>) Dato che il nostro testo ha una larghezza di 700 e l'area visibile è di 320px (larghezza dello schermo), impostiamo:
tXDelta = 700 - 320 = 380
E come si calcolano la larghezza dello schermo e la larghezza del testo?
Codice
Prendendo lo Snippet di Zarah come punto di partenza:
/**
* @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;
}
Potrebbero esserci modi più semplici per eseguire questa operazione, ma funziona per ogni visualizzazione a cui puoi pensare ed è riutilizzabile. È particolarmente utile se si desidera animare un TextView in un ListView senza interrompere le capacità abilitate / onFocus di textView. Inoltre scorre continuamente anche se la vista non è a fuoco.