TranslateAnimation
działa na zasadzie „ciągnięcia” widoku w jednym kierunku o określoną wartość. Możesz ustawić, gdzie rozpocząć i zakończyć to „ciągnięcie”.
TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta)
fromXDelta ustawia przesunięcie pozycji początkowej ruchu w osi 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 określa przesunięcie pozycji końcowej ruchu w osi 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.
Jeśli szerokość twojego tekstu jest większa niż moduł różnicy między fromXDelta i toXDelta, tekst nie będzie mógł całkowicie i przymusowo poruszać się po ekranie.
Przykład
Załóżmy, że rozmiar naszego ekranu to 320x240 pikseli. Mamy TextView z tekstem o szerokości 700 pikseli i chcemy stworzyć animację, która „ciągnie” tekst, abyśmy mogli zobaczyć koniec frazy.
(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... ||
---------------------------+|
| |
| |
| |
+---------------------------+
Najpierw ustawiliśmy fromXDelta = 0
tak, aby ruch nie miał offsetu początkowego. Teraz musimy obliczyć wartość toXDelta. Aby osiągnąć pożądany efekt, musimy „wyciągnąć” tekst dokładnie z tego samego piksela, który rozciąga się poza ekran. (w schemacie jest reprezentowane przez <<<< X px >>>>) Ponieważ nasz tekst ma 700 szerokości, a widoczny obszar to 320px (szerokość ekranu) ustalamy:
tXDelta = 700 - 320 = 380
Jak obliczymy szerokość ekranu i szerokość tekstu?
Kod
Biorąc fragment Zarah jako punkt wyjścia:
public static Animation scrollingText(View view, float margin){
Context context = view.getContext();
view.measure(View.MeasureSpec.UNSPECIFIED,
View.MeasureSpec.UNSPECIFIED);
float width = view.getMeasuredWidth();
float screenWidth = ((Activity) context).getWindowManager().getDefaultDisplay().getWidth();
float toXDelta = width - (screenWidth - margin);
if (toXDelta < 0) {toXDelta = 0; } else { toXDelta = 0 - toXDelta;}
Animation mAnimation = new TranslateAnimation(0, toXDelta, 0, 0);
mAnimation.setDuration(15000);
mAnimation.setRepeatMode(Animation.RESTART);
mAnimation.setRepeatCount(Animation.INFINITE);
return mAnimation;
}
Mogą istnieć prostsze sposoby, aby to zrobić, ale działa to w przypadku każdego widoku, o którym myślisz, i można go użyć ponownie. Jest to szczególnie przydatne, jeśli chcesz animować TextView w ListView bez przerywania możliwości enabled / onFocus w textView. Przewija się również w sposób ciągły, nawet jeśli widok nie jest ustawiony.