TranslateAnimation
bekerja dengan "menarik" View ke satu arah dengan jumlah tertentu. Anda dapat mengatur di mana untuk memulai "penarikan" ini dan di mana harus mengakhirinya.
TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta);
fromXDelta mengatur offset posisi awal gerakan di sumbu 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 mendefinisikan posisi akhir offset dari gerakan di sumbu 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.
Jika lebar teks Anda lebih besar dari modul perbedaan antara fromXDelta dan toXDelta, teks tidak akan dapat sepenuhnya dan benar-benar bergerak di dalam layar.
Contoh
Anggaplah ukuran layar kita 320x240 px. Kami memiliki TextView dengan teks yang memiliki lebar 700px dan kami ingin membuat animasi yang "menarik" teks tersebut sehingga kami dapat melihat akhir frasa.
(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... ||
---------------------------+|
| |
| |
| |
+---------------------------+
Pertama kita atur fromXDelta = 0
agar pergerakan tidak memiliki offset awal. Sekarang kita perlu mencari nilai toXDelta. Untuk mencapai efek yang diinginkan, kita perlu "menarik" teks dengan piksel yang sama persis dengan yang membentang di luar layar. (dalam skema diwakili oleh <<<< X px >>>>) Karena teks kita memiliki lebar 700, dan area yang terlihat adalah 320px (lebar layar) yang kita atur:
tXDelta = 700 - 320 = 380
Dan bagaimana kita menghitung Lebar Layar dan Lebar teks?
Kode
Mengambil Cuplikan Zarah sebagai titik awal:
/**
* @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;
}
Mungkin ada cara yang lebih mudah untuk melakukan ini, tetapi ini berfungsi untuk setiap tampilan yang dapat Anda pikirkan dan dapat digunakan kembali. Ini sangat berguna jika Anda ingin menganimasikan TextView dalam ListView tanpa merusak kemampuan aktif / onFocus dari textView. Itu juga menggulir terus menerus bahkan jika Tampilan tidak fokus.