ประเด็นสำคัญ
Interpolator — อินเทอร์เฟซใน Android ที่แมปค่าเศษส่วนของความคืบหน้าแอนิเมชัน (จาก 0.0 ถึง 1.0) ไปยังค่าจริงด้วยความเร็วที่ปรับเปลี่ยน หากแอนิเมชันใช้เวลา 300 มิลลิวินาที ระบบจะเรียก Interpolator สำหรับแต่ละเฟรม โดยส่งความคืบหน้าปัจจุบัน Interpolator ส่งค่าที่ปรับเปลี่ยนกลับมา — ตัวอย่างเช่น ด้วย AccelerateInterpolator ที่ 50% ของเวลา แอนิเมชันเดินทางไปเพียง ~25% ของเส้นทาง จำลองการเร่งความเร็ว
ในทางคณิตศาสตร์ Interpolator สามารถแสดงเป็นฟังก์ชัน f(t) โดยที่ t คือเวลาที่ทำให้เป็นมาตรฐาน [0, 1] และ f(t) คือค่าที่ทำให้เป็นมาตรฐาน [0, 1] (หรือกว้างกว่าสำหรับ Overshoot/Bounce) LinearInterpolator ส่งคืน f(t) = t — วัตถุเคลื่อนที่ด้วยความเร็วคงที่ AccelerateInterpolator ประมาณ f(t) = t², DecelerateInterpolator ประมาณ f(t) = 1 − (1 − t)² ทำให้เริ่มต้นหรือสิ้นสุดอย่างนุ่มนวล ใน Android Animation Framework Interpolator ถูกนำไปใช้ทั้ง ValueAnimator, ObjectAnimator และ ViewPropertyAnimator โดยให้แนวทางแบบรวมสำหรับการควบคุมความเร็วในทุกระดับ
Android มีอินเทอร์โพเลเตอร์ในตัว 9 ตัว แต่ละตัวมีแบบจำลองทางคณิตศาสตร์ของตัวเอง การเลือกอินเทอร์โพเลเตอร์กำหนดลักษณะของแอนิเมชัน: ความเป็นกายภาพ (Bounce), ความยืดหยุ่น (Overshoot) หรือความนุ่มนวล (AccelerateDecelerate)
| อินเทอร์โพเลเตอร์ | คณิตศาสตร์ | กรณีการใช้งาน |
|---|---|---|
| LinearInterpolator | f(t) = t | ตัวบ่งชี้ความคืบหน้า, ข้อความวิ่ง |
| AccelerateInterpolator | f(t) = tⁿ (n=2) | องค์ประกอบบินออกจากหน้าจอ ปรากฏจากด้านล่าง |
| DecelerateInterpolator | f(t) = 1 − (1 − t)ⁿ | วัตถุตก, เข้าจากด้านบนด้วยการชะลอ |
| AccelerateDecelerateInterpolator | การประมาณ cos | สากล, การปรากฏ/หายไปขององค์ประกอบ |
| AnticipateInterpolator | กำลังสามแบบถอยหลัง | เข้าแบบสปริง — วัตถุถอยหลังเล็กน้อยก่อนเริ่ม |
| OvershootInterpolator | กำลังสามแบบเกิน | ปุ่มดำเนินการ — เกินตำแหน่งเป้าหมายเล็กน้อย |
| AnticipateOvershootInterpolator | การรวม Anticipate + Overshoot | การ์ด — ถอยหลัง + เกินพร้อมกลับ |
| BounceInterpolator | การกระเด้งแบบหน่วง | ลูกบอล, องค์ประกอบตกบนพื้นผิว |
| PathInterpolator | Bezier กำลังสาม (2 จุดควบคุม) | เส้นโค้งแบบกำหนดเองสำหรับระบบออกแบบ |
อินเทอร์โพเลเตอร์แต่ละตัวมีการประกาศ XML ใน res/interpolator/ และคลาส Kotlin ในแพ็คเกจ android.view.animation AccelerateDecelerateInterpolator ถูกใช้บ่อยที่สุด: เส้นโค้งของมันคล้ายกับฟังก์ชัน easing ease-in-out ใน CSS สำหรับแอป Android ที่ใช้ Material Design แนะนำให้ใช้ OvershootInterpolator สำหรับปุ่มดำเนินการลอย (FAB) — มันสร้างเอฟเฟกต์กระเด้งเมื่อปรากฏ
PathInterpolator — อินเทอร์โพเลเตอร์ที่ใช้เส้นโค้ง Bezier ซึ่งกำหนดผ่านออบเจ็กต์ Path ใช้งานได้ตั้งแต่ API 21 (Android 5.0) ช่วยให้ออกแบบเส้นโค้งความเร็วได้ด้วยภาพ — นักออกแบบวาดเส้นโค้ง นักพัฒนาถ่ายโอนไปยังโค้ดผ่านพิกัดจุดควบคุม รองรับเฉพาะ Bezier กำลังสามเท่านั้น (สองจุดควบคุม C1, C2)
เส้นโค้ง PathInterpolator เริ่มต้นที่จุด (0,0) เสมอและสิ้นสุดที่ (1,1) จุดควบคุมกำหนดรูปร่าง: (x1, y1) — จุดเริ่มต้น, (x2, y2) — จุดสิ้นสุด ค่า x ต้องอยู่ในช่วง [0,1] — รับประกันความเป็นเอกภาพตามเวลา ค่า y สามารถออกนอก [0,1] — สร้างเอฟเฟกต์เกินหรือคาดการณ์ ตัวอย่างเช่น Material Design มาตรฐานใช้เส้นโค้ง fast-out-slow-in กับจุดควบคุม (0.4, 0.0, 0.2, 1.0) ที่ IT Sectr เราสร้าง PathInterpolator แบบกำหนดเองสำหรับแต่ละระบบออกแบบ — รับประกันแอนิเมชันที่สอดคล้องกันทุกหน้าจอ
หากอินเทอร์โพเลเตอร์ในตัวไม่ครอบคลุมสถานการณ์ของคุณ Android อนุญาตให้สร้างแบบกำหนดเองโดยใช้อินเทอร์เฟซ TimeInterpolator เมธอดเดียวคือ getInterpolation(input: Float): Float Input คือความคืบหน้าแอนิเมชันปัจจุบันจาก 0 ถึง 1; output คือค่าที่ปรับเปลี่ยน Output สามารถออกนอก [0,1] สำหรับเอฟเฟกต์เกินหรือกระเด้ง
อินเทอร์โพเลเตอร์แบบกำหนดเองทั่วไป: เอฟเฟกต์กระเด้งแบบหน่วง (เกิน 1.0 และกลับมา), เอฟเฟกต์ยืดหยุ่น (การหน่วงแบบไซน์), อินเทอร์โพเลเตอร์แบบขั้น (การกระโดดแบบไม่ต่อเนื่อง) อินเทอร์โพเลเตอร์แบบกำหนดเองยังสามารถกำหนดผ่าน XML โดยใช้แท็ก <interpolator> และระบุคลาส Android Studio มีการแสดงตัวอย่าง Interpolator ในตัวใน Layout Inspector — มันแสดงเส้นโค้งจริงสำหรับอินเทอร์โพเลเตอร์ที่เลือก ทำให้การดีบักง่ายขึ้น
แอนิเมชันสเกลปุ่มพื้นฐานโดยใช้อินเทอร์โพเลเตอร์แบบสมมาตร ValueAnimator เปลี่ยนค่าจาก 1.0 เป็น 1.2 และกลับ และ AccelerateDecelerateInterpolator ทำให้การเคลื่อนที่นุ่มนวล
import android.animation.ValueAnimator
import android.view.animation.AccelerateDecelerateInterpolator
import android.view.View
fun View.pulseAnimation() {
ValueAnimator.ofFloat(1.0f, 1.2f).apply {
duration = 300
interpolator = AccelerateDecelerateInterpolator()
repeatCount = 1
repeatMode = ValueAnimator.REVERSE
addUpdateListener { animator ->
val scale = animator.animatedValue as Float
this@pulseAnimation.scaleX = scale
this@pulseAnimation.scaleY = scale
}
start()
}
}
AccelerateDecelerateInterpolator สร้างการเร่งความเร็วที่นุ่มนวลในตอนเริ่มต้นและการชะลอที่นุ่มนวลในตอนจบ โหมด REVERSE ทำซ้ำแอนิเมชันในทิศทางตรงกันข้าม สร้างเอฟเฟกต์การเต้นเป็นจังหวะ รูปแบบนี้ใช้สำหรับปุ่มดำเนินการ ดึงดูดความสนใจของผู้ใช้ไปยังองค์ประกอบอินเทอร์เฟซที่สำคัญ
เส้นโค้งแบบกำหนดเองพร้อมเอฟเฟกต์เกิน — วัตถุเกินตำแหน่งเป้าหมาย 10% และกลับมา จุดควบคุม (0.4, 0.0, 0.6, 1.3) กำหนดการเข้าแบบเร่งด้วยการเกิน
import android.animation.ObjectAnimator
import android.graphics.Path
import android.view.animation.PathInterpolator
import android.view.View
fun View.slideWithOvershoot() {
val path = Path().apply {
cubicTo(0.4f, 0.0f, 0.6f, 1.3f, 1.0f, 1.0f)
}
val interpolator = PathInterpolator(path)
ObjectAnimator.ofFloat(this, "translationY", 200f, 0f).apply {
duration = 400
interpolator = interpolator
start()
}
}
PathInterpolator รับ Path ที่มีเส้นโค้ง Bezier กำลังสาม ในตัวอย่าง องค์ประกอบเกินตำแหน่งเป้าหมาย (y=1.3 ที่ 60% ของเวลา) และกลับไปยังตำแหน่งสุดท้าย Path ต้องเป็นเอกภาพอย่างเคร่งครัดตามแกน x มิฉะนั้นแอนิเมชันจะย้อนกลับ สำหรับการตรวจสอบ ให้ใช้ Layout Inspector ใน Android Studio
อินเทอร์โพเลเตอร์แบบกำหนดเองพร้อมเอฟเฟกต์กระเด้งแบบหน่วง การใช้งานผ่าน TimeInterpolator กับสี่รอบการหน่วง
import android.animation.TimeInterpolator
class DampedBounceInterpolator : TimeInterpolator {
private val cycles = 4
private val damping = 0.85f
override fun getInterpolation(input: Float): Float {
val t = input * cycles
val decay = Math.pow(damping.toDouble(), cycles.toDouble()).toFloat()
val peak = t - (Math.floor(t.toDouble())).toFloat()
val bounce = Math.sin(peak * Math.PI).toFloat()
return 1f - bounce * decay * (1f - input)
}
}
DampedBounceInterpolator แบบกำหนดเองสร้างการกระเด้งแบบหน่วง 4 ครั้งด้วยค่าสัมประสิทธิ์การหน่วง 0.85 เมธอด getInterpolation รับอินพุตเชิงเส้นและส่งค่ากลับพร้อมเอฟเฟกต์สปริง ที่ IT Sectr เราใช้อินเทอร์โพเลเตอร์นี้สำหรับแอนิเมชันการปรากฏของการแจ้งเตือน — การกระเด้งสร้างความรู้สึกทางกายภาพและดึงดูดความสนใจ
คำถามที่พบบ่อย
AccelerateDecelerateInterpolator สร้าง เส้นโค้งสมมาตร — วัตถุเร่งที่จุดเริ่มต้นและชะลอที่จุดสิ้นสุด PathInterpolator อนุญาตให้ระบุเส้นโค้งตามต้องการผ่าน Path ด้วยจุดควบคุม (Bezier กำลังสาม) สำหรับแอนิเมชันแบบกำหนดเองที่มีพฤติกรรมไม่สมมาตร (เช่น เริ่มเร็ว + จบช้า) ให้ใช้ PathInterpolator กับจุดควบคุม (0.2, 0.8, 0.4, 1.0)
ได้ ใช้อินเทอร์เฟซ TimeInterpolator และแทนที่เมธอด getInterpolation(input: Float): Float Input คือค่าเศษส่วนจาก 0 ถึง 1 (ความคืบหน้าแอนิเมชัน), output คือค่าจริง ตัวอย่างเช่น เอฟเฟกต์กระเด้งถูกใช้งานโดยการส่งค่าที่มากกว่า 1 หรือน้อยกว่า 0 สำหรับพฤติกรรมคล้ายสปริง ลงทะเบียนอินเทอร์โพเลเตอร์ผ่านแท็ก XML
PathInterpolator ถูกเพิ่มใน API 21 (Android 5.0 Lollipop) สำหรับเวอร์ชันเก่า ให้ใช้ AccelerateDecelerateInterpolator หรือ TimeInterpolator แบบกำหนดเอง PathInterpolator รองรับเฉพาะเส้นโค้ง Bezier กำลังสามที่มีสองจุดควบคุม — เส้นตรงและเส้นโค้งกำลังสองอาจให้การแก้ที่ผิดพลาด สำหรับความเข้ากันได้ย้อนหลัง ให้ใช้ AccelerateDecelerateInterpolator เป็นตัวสำรอง
Material Design 3 แนะนำเส้นโค้ง fast-out-slow-in ด้วยจุดควบคุม (0.4, 0.0, 0.2, 1.0) สำหรับการปรากฏขององค์ประกอบ, linear-out-slow-in (0.0, 0.0, 0.2, 1.0) สำหรับการหายไป และ fast-out-linear-in (0.4, 0.0, 1.0, 1.0) สำหรับการเคลื่อนที่ ใน Android เส้นโค้งเหล่านี้ถูกใช้งานในคลาส FastOutSlowInInterpolator จากไลบรารี Material Components
น้อยมาก อินเทอร์โพเลเตอร์ในตัวดำเนินการทางคณิตศาสตร์หนึ่งครั้งต่อเฟรม — โอเวอร์เฮดเล็กน้อย อินเทอร์โพเลเตอร์แบบกำหนดเองที่มีการคำนวณหนัก (ตรีโกณมิติ, ลูป) อาจทำให้เกิด micro-jank บนอุปกรณ์ที่อ่อนแอ ปรับให้เหมาะสมโดยการคำนวณค่าล่วงหน้าในคอนสตรักเตอร์หรือใช้ TimeInterpolator ด้วยการแคช
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม