Saya menganimasikan CALayer
sepanjang CGPath
(QuadCurve) dengan cukup baik di iOS. Tapi saya ingin menggunakan fungsi easing yang lebih menarik daripada yang disediakan oleh Apple (EaseIn / EaseOut dll). Misalnya, fungsi pantulan atau elastis.
Hal-hal berikut dapat dilakukan dengan MediaTimingFunction (bezier):
Tapi saya ingin membuat fungsi pengaturan waktu yang lebih kompleks. Masalahnya adalah bahwa pengaturan waktu media tampaknya memerlukan bezier kubik yang tidak cukup kuat untuk menciptakan efek berikut:
(sumber: sparrow-framework.org )
The kode untuk membuat cukup sederhana di atas adalah dalam framework lain, yang membuat sangat frustasi ini. Perhatikan bahwa kurva memetakan waktu masukan ke waktu keluaran (kurva Tt) dan bukan kurva waktu-posisi. Misalnya, easyOutBounce (T) = t mengembalikan t baru . Kemudian t itu digunakan untuk memplot gerakan (atau properti apa pun yang harus kita animasikan).
Jadi, saya ingin membuat kebiasaan yang rumit CAMediaTimingFunction
tetapi saya tidak tahu bagaimana melakukannya, atau apakah itu mungkin? Apakah ada alternatif lain?
EDIT:
Berikut adalah contoh konkret untuk langkah. Sangat mendidik :)
Saya ingin menganimasikan objek di sepanjang garis dari titik a ke b , tetapi saya ingin objek "memantulkan" pergerakannya di sepanjang garis menggunakan kurva kemudahanOutBounce di atas. Ini berarti itu akan mengikuti garis yang tepat dari a ke b , tetapi akan mempercepat dan melambat dengan cara yang lebih kompleks daripada yang mungkin menggunakan CAMediaTimingFunction berbasis bezier saat ini.
Mari kita buat garis itu setiap gerakan kurva arbitrer yang ditentukan dengan CGPath. Itu harus tetap bergerak di sepanjang kurva itu, tetapi itu harus dipercepat dan diperlambat dengan cara yang sama seperti pada contoh garis.
Secara teori saya pikir itu harus bekerja seperti ini:
Mari kita gambarkan kurva pergerakan sebagai animasi keyframe move (t) = p , dimana t adalah waktu [0..1], p adalah posisi yang dihitung pada waktu t . Jadi move (0) mengembalikan posisi pada awal kurva, gerakkan (0,5) tepat di tengah dan gerakkan (1) di akhir. Menggunakan fungsi waktu waktu (T) = t untuk memberikan nilai t untuk memindahkan harus memberi saya apa yang saya inginkan. Untuk efek pantulan, fungsi waktu harus mengembalikan nilai t yang sama untuk waktu (0.8) dan waktu (0.8)(hanya contoh). Ganti saja fungsi pengaturan waktu untuk mendapatkan efek yang berbeda.
(Ya, memantulkan garis mungkin dilakukan dengan membuat dan menggabungkan empat segmen garis yang bolak-balik, tetapi itu tidak perlu. Bagaimanapun, ini hanya fungsi linier sederhana yang memetakan nilai waktu ke posisi.)
Saya harap saya masuk akal di sini.