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 ピクセルであるとします。幅 700px のテキストを含む TextView があり、フレーズの終わりが見えるようにテキストを「引っ張る」アニメーションを作成したいと考えています。
(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 値を計算する必要があります。目的の効果を得るには、テキストが画面の外に広がるのとまったく同じ px だけテキストを「引き出す」必要があります。(スキームでは <<<< 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 の enabled/onFocus 機能を壊さずに ListView で TextView をアニメーション化する場合に特に便利です。ビューがフォーカスされていない場合でも、継続的にスクロールします。