TranslateAnimation
работает, «подтягивая» вид в одном направлении на указанную величину. Вы можете указать, где начинать это «вытягивание», а где заканчивать.
TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta)
fromXDelta задает смещение начальной позиции движения по оси 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 определяет конечную позицию смещения движения по оси 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.
Если ширина вашего текста больше, чем модуль разницы между fromXDelta и toXDelta, текст не сможет полностью перемещаться по экрану.
пример
Предположим, у нас размер экрана 320x240 пикселей. У нас есть TextView с текстом шириной 700 пикселей, и мы хотим создать анимацию, которая «вытягивает» текст, чтобы мы могли видеть конец фразы.
(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... ||
---------------------------+|
| |
| |
| |
+---------------------------+
Сначала мы устанавливаем fromXDelta = 0
так, чтобы движение не имело начального смещения. Теперь нам нужно вычислить значение toXDelta. Чтобы добиться желаемого эффекта, нам нужно «вытянуть» текст на столько же пикселей, сколько он занимает за пределы экрана. (на схеме обозначено <<<< X px >>>>) Поскольку наш текст имеет ширину 700, а видимая область - 320 пикселей (ширина экрана), мы устанавливаем:
tXDelta = 700 - 320 = 380
А как нам определить ширину экрана и ширину текста?
Код
Взяв фрагмент Зара в качестве отправной точки:
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;
}
Могут быть более простые способы сделать это, но это работает для всех представлений, которые вы можете придумать, и его можно использовать повторно. Это особенно полезно, если вы хотите анимировать TextView в ListView, не нарушая возможности enabled / onFocus для textView. Он также непрерывно прокручивается, даже если вид не сфокусирован.