Những điểm chính
Interpolator — một giao diện trong Android ánh xạ giá trị phân số của tiến trình hoạt ảnh (từ 0.0 đến 1.0) thành giá trị thực tế với tốc độ đã được sửa đổi. Nếu một hoạt ảnh kéo dài 300 mili giây, hệ thống sẽ gọi Interpolator cho mỗi khung hình, truyền tiến trình hiện tại. Interpolator trả về giá trị đã sửa đổi — ví dụ: với AccelerateInterpolator tại 50% thời gian, hoạt ảnh chỉ đi được ~25% quãng đường, mô phỏng sự tăng tốc.
Về mặt toán học, Interpolator có thể được biểu diễn dưới dạng hàm f(t), trong đó t là thời gian chuẩn hóa [0, 1] và f(t) là giá trị chuẩn hóa [0, 1] (hoặc rộng hơn cho Overshoot/Bounce). LinearInterpolator trả về f(t) = t — vật thể di chuyển với tốc độ không đổi. AccelerateInterpolator xấp xỉ f(t) = t², DecelerateInterpolator xấp xỉ f(t) = 1 − (1 − t)², tạo ra sự bắt đầu hoặc kết thúc mượt mà. Trong Android Animation Framework, Interpolator được áp dụng cho cả ValueAnimator, ObjectAnimator và ViewPropertyAnimator, cung cấp một cách tiếp cận thống nhất để kiểm soát tốc độ ở mọi cấp độ.
Android cung cấp 9 bộ nội suy tích hợp, mỗi bộ có mô hình toán học riêng. Việc lựa chọn bộ nội suy quyết định tính chất của hoạt ảnh: tính vật lý (Bounce), tính đàn hồi (Overshoot) hoặc độ mượt (AccelerateDecelerate).
| Bộ nội suy | Toán học | Trường hợp sử dụng |
|---|---|---|
| LinearInterpolator | f(t) = t | Chỉ báo tiến trình, văn bản chạy |
| AccelerateInterpolator | f(t) = tⁿ (n=2) | Phần tử bay ra khỏi màn hình, xuất hiện từ dưới lên |
| DecelerateInterpolator | f(t) = 1 − (1 − t)ⁿ | Vật thể rơi, đi vào từ trên xuống với sự giảm tốc |
| AccelerateDecelerateInterpolator | Xấp xỉ cos | Phổ biến, xuất hiện/biến mất phần tử |
| AnticipateInterpolator | Bậc ba với lùi lại | Vào có lò xo — vật thể lùi lại một chút trước khi bắt đầu |
| OvershootInterpolator | Bậc ba với vượt quá | Nút hành động — vượt quá một chút vị trí mục tiêu |
| AnticipateOvershootInterpolator | Kết hợp Anticipate + Overshoot | Thẻ — lùi lại + vượt quá và quay về |
| BounceInterpolator | Nảy tắt dần | Quả bóng, phần tử rơi xuống bề mặt |
| PathInterpolator | Bezier bậc ba (2 điểm điều khiển) | Đường cong tùy chỉnh cho hệ thống thiết kế |
Mỗi bộ nội suy có khai báo XML trong res/interpolator/ và một lớp Kotlin trong gói android.view.animation. AccelerateDecelerateInterpolator được sử dụng nhiều nhất: đường cong của nó giống với hàm easing ease-in-out trong CSS. Đối với các ứng dụng Android với Material Design, OvershootInterpolator được khuyến nghị cho các nút hành động nổi (FAB) — nó tạo hiệu ứng nảy khi xuất hiện.
PathInterpolator — một bộ nội suy dựa trên đường cong Bezier, được xác định qua đối tượng Path. Có sẵn từ API 21 (Android 5.0). Cho phép thiết kế trực quan đường cong tốc độ — nhà thiết kế vẽ đường cong, nhà phát triển chuyển nó thành mã thông qua tọa độ điểm điều khiển. Chỉ hỗ trợ Bezier bậc ba (hai điểm điều khiển C1, C2).
Đường cong PathInterpolator luôn bắt đầu tại điểm (0,0) và kết thúc tại (1,1). Các điểm điều khiển xác định hình dạng: (x1, y1) — điểm bắt đầu, (x2, y2) — điểm kết thúc. Giá trị x phải nằm trong khoảng [0,1] — điều này đảm bảo tính đơn điệu theo thời gian. Giá trị y có thể vượt ra ngoài [0,1] — điều này tạo hiệu ứng vượt quá hoặc dự đoán. Ví dụ, Material Design tiêu chuẩn sử dụng đường cong fast-out-slow-in với các điểm điều khiển (0.4, 0.0, 0.2, 1.0). Tại IT Sectr, chúng tôi xây dựng PathInterpolators tùy chỉnh cho mỗi hệ thống thiết kế — điều này đảm bảo hoạt ảnh nhất quán trên tất cả các màn hình.
Nếu các bộ nội suy tích hợp không bao phủ kịch bản của bạn, Android cho phép tạo bộ nội suy tùy chỉnh bằng cách triển khai giao diện TimeInterpolator. Phương thức duy nhất là getInterpolation(input: Float): Float. Input là tiến trình hoạt ảnh hiện tại từ 0 đến 1; output là giá trị đã sửa đổi. Output có thể vượt ra ngoài [0,1] cho hiệu ứng vượt quá hoặc nảy.
Các bộ nội suy tùy chỉnh điển hình: hiệu ứng nảy tắt dần (vượt quá 1.0 và quay lại), hiệu ứng đàn hồi (tắt dần hình sin), bộ nội suy bước (nhảy rời rạc). Các bộ nội suy tùy chỉnh cũng có thể được xác định qua XML bằng thẻ <interpolator> và chỉ định lớp. Android Studio có tính năng xem trước Interpolator tích hợp trong Layout Inspector — nó hiển thị đường cong thực tế cho bộ nội suy đã chọn, giúp việc gỡ lỗi đơn giản hơn.
Hoạt ảnh tỷ lệ nút cơ bản sử dụng bộ nội suy đối xứng. ValueAnimator thay đổi giá trị từ 1.0 lên 1.2 và quay lại, và AccelerateDecelerateInterpolator làm cho chuyển động mượt mà.
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 tạo ra sự tăng tốc mượt mà ở đầu và giảm tốc mượt mà ở cuối. Chế độ REVERSE lặp lại hoạt ảnh theo hướng ngược lại, tạo hiệu ứng xung động. Mẫu này được sử dụng cho các nút hành động, thu hút sự chú ý của người dùng đến một phần tử giao diện chính.
Đường cong tùy chỉnh với hiệu ứng vượt quá — vật thể vượt quá vị trí mục tiêu 10% và quay lại. Các điểm điều khiển (0.4, 0.0, 0.6, 1.3) xác định lối vào tăng tốc với vượt quá.
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 chấp nhận một Path với đường cong Bezier bậc ba. Trong ví dụ, phần tử vượt quá vị trí mục tiêu (y=1.3 tại 60% thời gian) và quay lại vị trí cuối cùng. Path phải đơn điệu chặt chẽ theo trục x, nếu không hoạt ảnh sẽ chạy ngược lại. Để xác minh, hãy sử dụng Layout Inspector trong Android Studio.
Bộ nội suy tùy chỉnh với hiệu ứng nảy tắt dần. Triển khai qua TimeInterpolator với bốn chu kỳ tắt dần.
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 tùy chỉnh tạo ra 4 lần nảy tắt dần với hệ số tắt dần 0,85. Phương thức getInterpolation nhận đầu vào tuyến tính và trả về giá trị với hiệu ứng lò xo. Tại IT Sectr, chúng tôi sử dụng bộ nội suy này cho hoạt ảnh xuất hiện thông báo — sự nảy tạo ra cảm giác vật lý và thu hút sự chú ý.
Câu hỏi thường gặp
AccelerateDecelerateInterpolator tạo ra một đường cong đối xứng — vật thể tăng tốc ở đầu và giảm tốc ở cuối. PathInterpolator cho phép chỉ định một đường cong tùy ý qua Path với một điểm điều khiển (Bezier bậc ba). Đối với hoạt ảnh tùy chỉnh có hành vi bất đối xứng (ví dụ: bắt đầu nhanh + kết thúc chậm), hãy sử dụng PathInterpolator với các điểm điều khiển (0.2, 0.8, 0.4, 1.0).
Có, hãy triển khai giao diện TimeInterpolator và ghi đè phương thức getInterpolation(input: Float): Float. Input là giá trị phân số từ 0 đến 1 (tiến trình hoạt ảnh), output là giá trị thực tế. Ví dụ, hiệu ứng nảy được triển khai bằng cách trả về giá trị lớn hơn 1 hoặc nhỏ hơn 0 để có hành vi giống lò xo. Đăng ký bộ nội suy qua thẻ XML
PathInterpolator được thêm vào trong API 21 (Android 5.0 Lollipop). Đối với các phiên bản cũ hơn, hãy sử dụng AccelerateDecelerateInterpolator hoặc TimeInterpolator tùy chỉnh. PathInterpolator chỉ hỗ trợ đường cong Bezier bậc ba với hai điểm điều khiển — đường thẳng và đường cong bậc hai có thể tạo ra nội suy không chính xác. Để tương thích ngược, hãy sử dụng AccelerateDecelerateInterpolator làm phương án dự phòng.
Material Design 3 khuyến nghị đường cong fast-out-slow-in với các điểm điều khiển (0.4, 0.0, 0.2, 1.0) cho sự xuất hiện của phần tử, linear-out-slow-in (0.0, 0.0, 0.2, 1.0) cho sự biến mất và fast-out-linear-in (0.4, 0.0, 1.0, 1.0) cho chuyển động. Trong Android, các đường cong này được triển khai trong lớp FastOutSlowInInterpolator từ thư viện Material Components.
Tối thiểu. Các bộ nội suy tích hợp thực hiện một phép toán mỗi khung hình — chi phí không đáng kể. Các bộ nội suy tùy chỉnh với tính toán nặng (lượng giác, vòng lặp) có thể gây micro-jank trên các thiết bị yếu. Tối ưu hóa bằng cách tính toán trước giá trị trong hàm tạo hoặc sử dụng TimeInterpolator với bộ nhớ đệm.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm