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 с текстом шириной 700px, и мы хотим создать анимацию, которая «вытягивает» текст, чтобы мы могли видеть конец фразы.
(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
А как нам определить ширину экрана и ширину текста?
код
Взятие фрагмента Zarah в качестве отправной точки:
/**
* @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;
}
Возможно, есть более простые способы сделать это, но это работает для каждого представления, которое вы можете придумать, и его можно использовать повторно. Это особенно полезно, если вы хотите анимировать TextView в ListView, не нарушая включенных / onFocus возможностей textView. Он также непрерывно прокручивается, даже если вид не сфокусирован.