TranslateAnimation
hoạt động bằng cách "kéo" Chế độ xem theo một hướng theo một lượng xác định. Bạn có thể đặt nơi bắt đầu "kéo" này và nơi kết thúc.
TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta);
fromXDelta đặt độ lệch của vị trí bắt đầu của chuyển động trong trục 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ác định vị trí kết thúc bù của chuyển động trong trục 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.
Nếu chiều rộng của văn bản của bạn lớn hơn mô-đun của sự khác biệt giữa fromXDelta và toXDelta, thì văn bản sẽ không thể toàn bộ và bắt buộc phải di chuyển trong màn hình.
Thí dụ
Giả sử kích thước màn hình của chúng ta là 320x240 pxs. Chúng tôi có một TextView với văn bản có chiều rộng 700px và chúng tôi muốn tạo hoạt ảnh "kéo" văn bản để chúng tôi có thể nhìn thấy phần cuối của cụm từ.
(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... ||
---------------------------+|
| |
| |
| |
+---------------------------+
Đầu tiên, chúng tôi thiết lập fromXDelta = 0
để chuyển động không có độ lệch ban đầu. Bây giờ chúng ta cần tính toán giá trị toXDelta. Để đạt được hiệu ứng mong muốn, chúng ta cần "kéo" văn bản giống hệt px mà nó kéo ra khỏi màn hình. (trong lược đồ được biểu thị bằng <<<< X px >>>>) Vì văn bản của chúng ta có chiều rộng 700 và vùng hiển thị là 320px (chiều rộng màn hình), chúng tôi đặt:
tXDelta = 700 - 320 = 380
Và làm thế nào để chúng ta xác định Chiều rộng màn hình và Chiều rộng văn bản?
Mã
Lấy Zarah Snippet làm điểm khởi đầu:
/**
* @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;
}
Có thể có nhiều cách dễ dàng hơn để thực hiện việc này, nhưng cách này phù hợp với mọi chế độ xem bạn có thể nghĩ đến và có thể tái sử dụng. Đặc biệt hữu ích nếu bạn muốn tạo hiệu ứng cho TextView trong ListView mà không phá vỡ khả năng bật / onFocus của textView. Nó cũng cuộn liên tục ngay cả khi Chế độ xem không được lấy nét.