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 และพื้นที่ที่มองเห็นได้คือ 320px (ความกว้างของหน้าจอ) เราจึงตั้งค่า:
tXDelta = 700 - 320 = 380
แล้วเราจะกำหนดความกว้างของหน้าจอและความกว้างของข้อความได้อย่างไร?
รหัส
การใช้ Zarah Snippet เป็นจุดเริ่มต้น:
public static Animation scrollingText(View view, float margin){
Context context = view.getContext();
view.measure(View.MeasureSpec.UNSPECIFIED,
View.MeasureSpec.UNSPECIFIED);
float width = view.getMeasuredWidth();
float screenWidth = ((Activity) context).getWindowManager().getDefaultDisplay().getWidth();
float toXDelta = width - (screenWidth - margin);
if (toXDelta < 0) {toXDelta = 0; } else { toXDelta = 0 - toXDelta;}
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 นอกจากนี้ยังเลื่อนอย่างต่อเนื่องแม้ว่าจะไม่ได้โฟกัสมุมมองก็ตาม