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 ширину, а видима область 320px (ширина екрану), ми встановлюємо:
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. Він також прокручується безперервно, навіть якщо вигляд не сфокусований.