โดยมักจะต้องเปลี่ยนตำแหน่งออบเจ็กต์บนหน้าจอเนื่องจากการโต้ตอบของผู้ใช้หรือ การประมวลผลเบื้องหลัง แทนที่จะอัปเดตตำแหน่งของออบเจ็กต์ทันที ซึ่งจะทำให้ออบเจ็กต์กะพริบจากพื้นที่หนึ่งไปยังอีกพื้นที่หนึ่ง ให้ใช้ภาพเคลื่อนไหวเพื่อย้ายออบเจ็กต์จากตำแหน่งเริ่มต้นไปยังตำแหน่งสิ้นสุด
วิธีหนึ่งที่ Android ช่วยให้คุณเปลี่ยนตำแหน่งออบเจ็กต์มุมมองบนหน้าจอได้คือการใช้ ObjectAnimator คุณระบุตำแหน่งสิ้นสุดที่ต้องการให้วัตถุไปอยู่ รวมถึงระยะเวลาของภาพเคลื่อนไหว นอกจากนี้ คุณยังใช้ตัวประมาณค่าเวลาเพื่อควบคุมการเร่งหรือลดความเร็วของ
ภาพเคลื่อนไหวได้ด้วย
เปลี่ยนตำแหน่งมุมมองด้วย ObjectAnimator
ObjectAnimator
API มีวิธีเปลี่ยนพร็อพเพอร์ตี้ของมุมมองที่มีระยะเวลาที่ระบุ
ซึ่งมีเมธอดแบบคงที่เพื่อสร้างอินสแตนซ์ของ ObjectAnimator โดยขึ้นอยู่กับ
ประเภทแอตทริบิวต์ที่คุณกำลังเคลื่อนไหว เมื่อจัดตำแหน่งมุมมองบนหน้าจอใหม่ ให้ใช้แอตทริบิวต์ translationX และ translationY
ตัวอย่าง ObjectAnimator ที่ย้ายมุมมองไปยังตำแหน่ง 100
พิกเซลจากด้านซ้ายของหน้าจอใน 2 วินาที
Kotlin
ObjectAnimator.ofFloat(view, "translationX", 100f).apply { duration = 2000 start() }
Java
ObjectAnimator animation = ObjectAnimator.ofFloat(view, "translationX", 100f); animation.setDuration(2000); animation.start();
ตัวอย่างนี้ใช้เมธอด
ObjectAnimator.ofFloat()
เนื่องจากค่าการแปลต้องเป็นค่าทศนิยม พารามิเตอร์แรกคือ
มุมมองที่ต้องการเคลื่อนไหว พารามิเตอร์ที่ 2 คือพร็อพเพอร์ตี้ที่คุณ
กําลังทําภาพเคลื่อนไหว เนื่องจากมุมมองต้องเลื่อนในแนวนอน จึงใช้พร็อพเพอร์ตี้ translationX
พารามิเตอร์สุดท้ายคือค่าสิ้นสุดของภาพเคลื่อนไหว ใน
ตัวอย่างนี้ ค่า 100 แสดงถึงตำแหน่งที่อยู่ห่างจากด้านซ้ายของ
หน้าจอเป็นจำนวนพิกเซล
เมธอดถัดไปจะระบุระยะเวลาของภาพเคลื่อนไหวเป็นมิลลิวินาที ใน ตัวอย่างนี้ ภาพเคลื่อนไหวจะทำงานเป็นเวลา 2 วินาที (2, 000 มิลลิวินาที)
วิธีสุดท้ายจะทำให้ภาพเคลื่อนไหวทำงาน ซึ่งจะอัปเดตตำแหน่งของมุมมอง บนหน้าจอ
ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ ObjectAnimator ได้ที่สร้างภาพเคลื่อนไหวโดยใช้
ObjectAnimator
เพิ่มการเคลื่อนไหวแบบโค้ง
แม้ว่าการใช้ ObjectAnimator จะสะดวก แต่โดยค่าเริ่มต้นแล้วฟีเจอร์นี้จะจัดตำแหน่งมุมมองใหม่ตามแนวเส้นตรงระหว่างจุดเริ่มต้นและจุดสิ้นสุด Material
design ใช้เส้นโค้งสำหรับการเคลื่อนไหวเชิงพื้นที่ของออบเจ็กต์บนหน้าจอและ
เวลาของภาพเคลื่อนไหว การใช้การเคลื่อนไหวแบบโค้งจะช่วยให้แอปดูเป็นวัตถุมากขึ้น
พร้อมทั้งทำให้ภาพเคลื่อนไหวน่าสนใจยิ่งขึ้น
กำหนดเส้นทางของคุณเอง
คลาส ObjectAnimator มีตัวสร้างที่ช่วยให้คุณเคลื่อนไหวพิกัด
โดยใช้พร็อพเพอร์ตี้ 2 รายการขึ้นไปพร้อมกันตามเส้นทาง ตัวอย่างเช่น Animator ต่อไปนี้ใช้ออบเจ็กต์ Path เพื่อสร้างภาพเคลื่อนไหวให้กับพร็อพเพอร์ตี้ X และ Y ของมุมมอง
Kotlin
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { val path = Path().apply { arcTo(0f, 0f, 1000f, 1000f, 270f, -180f, true) } val animator = ObjectAnimator.ofFloat(view, View.X, View.Y, path).apply { duration = 2000 start() } } else { // Create animator without using curved path }
Java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Path path = new Path(); path.arcTo(0f, 0f, 1000f, 1000f, 270f, -180f, true); ObjectAnimator animator = ObjectAnimator.ofFloat(view, View.X, View.Y, path); animator.setDuration(2000); animator.start(); } else { // Create animator without using curved path }
ภาพเคลื่อนไหวของส่วนโค้งจะมีลักษณะดังนี้
รูปที่ 1 ภาพเคลื่อนไหวเส้นทางโค้ง
Interpolator คือการใช้งานเส้นโค้งการค่อยๆ เปลี่ยน ดูข้อมูลเพิ่มเติมเกี่ยวกับแนวคิดของเส้นโค้งการเปลี่ยนภาพได้ในเอกสารประกอบของ Material Design Interpolator
กำหนดวิธีคำนวณค่าที่เฉพาะเจาะจงในภาพเคลื่อนไหวเป็นฟังก์ชันของ
เวลา ระบบมีทรัพยากร XML สำหรับเส้นโค้งพื้นฐาน 3 เส้นใน
ข้อกำหนดของ Material Design ดังนี้
@interpolator/fast_out_linear_in.xml@interpolator/fast_out_slow_in.xml@interpolator/linear_out_slow_in.xml
ใช้ PathInterpolator
คลาส
PathInterpolator
เป็นตัวแทรกที่เปิดตัวใน Android 5.0 (API 21) โดยอิงตามเส้นโค้งเบซิเยร์หรือออบเจ็กต์Path ตัวอย่าง Android ในเอกสารประกอบเกี่ยวกับ Material Design สำหรับ
การค่อยๆ เปลี่ยน
ใช้ PathInterpolator
PathInterpolator มีตัวสร้างที่อิงตามเส้นโค้งเบซิเยร์ประเภทต่างๆ
เส้นโค้งเบซิเยร์ทั้งหมดมีจุดเริ่มต้นและจุดสิ้นสุดที่กำหนดไว้ที่ (0,0) และ (1,1) ตามลำดับ
อาร์กิวเมนต์เครื่องมือสร้างอื่นๆ จะขึ้นอยู่กับประเภทของเส้นโค้งเบซิเยร์ ที่สร้างขึ้น
ตัวอย่างเช่น สำหรับเส้นโค้ง Bézier กำลังสอง คุณจะต้องระบุเฉพาะพิกัด X และ Y ของจุดควบคุม 1 จุด
Kotlin
val myInterpolator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { PathInterpolator(0.67f, 0.33f) } else { LinearInterpolator() }
Java
Interpolator myInterpolator = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { myInterpolator = new PathInterpolator(0.67f, 0.33f); } else { myInterpolator = new LinearInterpolator(); }
ซึ่งจะสร้างเส้นโค้งการค่อยๆ เปลี่ยนที่เริ่มอย่างรวดเร็วและชะลอตัวลงเมื่อใกล้ถึงจุดสิ้นสุด
ในทำนองเดียวกัน ตัวสร้างฟังก์ชัน Cubic Bézier มีจุดเริ่มต้นและจุดสิ้นสุดที่แน่นอน แต่ต้องมีจุดควบคุม 2 จุด
Kotlin
val myInterpolator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { PathInterpolator(0.5f, 0.7f, 0.1f, 1.0f) } else { LinearInterpolator() }
Java
Interpolator myInterpolator = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { myInterpolator = new PathInterpolator(0.5f, 0.7f, 0.1f, 1.0f); } else { myInterpolator = new LinearInterpolator(); }
ซึ่งเป็นการใช้งานเส้นโค้งการลดความเร็วที่เน้น ของ Material Design
คุณใช้ Path ใดก็ได้เพื่อกำหนดเส้นโค้งเพื่อให้ควบคุมได้มากขึ้น
Kotlin
val myInterpolator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { val path = Path().apply { moveTo(0.0f, 0.0f) cubicTo(0.5f, 0.7f, 0.1f, 1.0f, 1.0f, 1.0f) } PathInterpolator(path) } else { LinearInterpolator() }
Java
Interpolator myInterpolator = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Path path = new Path(); path.moveTo(0.0f, 0.0f); path.cubicTo(0.5f, 0.7f, 0.1f, 1.0f, 1.0f, 1.0f); myInterpolator = new PathInterpolator(path); } else { myInterpolator = new LinearInterpolator(); }
ซึ่งจะสร้างเส้นโค้งการค่อยๆ เปลี่ยนแบบเดียวกันกับตัวอย่าง Cubic Bézier แต่จะใช้ Path แทน
คุณยังกำหนดตัวแทรกเส้นทางเป็นทรัพยากร XML ได้ด้วย
<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
android:controlX1="0.5"
android:controlY1="0.7"
android:controlX2="0.1f"
android:controlY2="1.0f"/>
เมื่อสร้างออบเจ็กต์ PathInterpolator แล้ว คุณจะส่งออบเจ็กต์ไปยังเมธอด
Animator.setInterpolator()
ได้ Animator จะใช้อินเทอร์พอเลเตอร์เพื่อกำหนดเวลาหรือเส้นทาง
เส้นโค้งเมื่อเริ่มต้น
Kotlin
val animation = ObjectAnimator.ofFloat(view, "translationX", 100f).apply { interpolator = myInterpolator start() }
Java
ObjectAnimator animation = ObjectAnimator.ofFloat(view, "translationX", 100f); animation.setInterpolator(myInterpolator); animation.start();