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.
sumber
Jawaban:
Aku menemukan ini:
Cocoa with Love - Kurva akselerasi parametrik di Core Animation
Tapi saya pikir itu bisa dibuat lebih sederhana dan lebih mudah dibaca dengan menggunakan blok. Jadi kita dapat menentukan kategori di CAKeyframeAnimation yang terlihat seperti ini:
CAKeyframeAnimation + Parametric.h:
CAKeyframeAnimation + Parametric.m:
Sekarang penggunaannya akan terlihat seperti ini:
Saya tahu ini mungkin tidak sesederhana yang Anda inginkan, tetapi ini adalah permulaan.
sumber
Dari iOS 10 menjadi mungkin untuk membuat fungsi pengaturan waktu kustom lebih mudah menggunakan dua objek pengaturan waktu baru.
1) UICubicTimingParameters memungkinkan untuk menentukan kurva Bézier kubik sebagai fungsi easing.
atau cukup menggunakan titik kontrol pada inisialisasi animator
Layanan luar biasa ini akan membantu memilih titik kontrol untuk lekuk tubuh Anda.
2) UISpringTimingParameters memungkinkan pengembang memanipulasi rasio redaman , massa , kekakuan , dan kecepatan awal untuk menciptakan perilaku pegas yang diinginkan.
Parameter durasi masih disajikan di Animator, tetapi akan diabaikan untuk pengaturan waktu musim semi.
Jika kedua opsi ini tidak cukup, Anda juga dapat menerapkan kurva waktu Anda sendiri dengan mengonfirmasi ke protokol UITimingCurveProvider .
Lebih lengkapnya, cara membuat animasi dengan parameter timing yang berbeda bisa Anda temukan di dokumentasi .
Lihat juga presentasi Kemajuan Animasi dan Transisi UIKit dari WWDC 2016.
sumber
CoreAnimation
versiUISpringTimingParameters
(CASpringAnimation
) didukung kembali ke iOS 9!UITimingCurveProvider
untuk tidak hanya mewakili kubik atau animasi pegas, tetapi juga untuk mewakili animasi yang menggabungkan kubik dan pegas melaluiUITimingCurveType.composed
.Cara untuk membuat fungsi pengaturan waktu kustom adalah dengan menggunakan metode functionWithControlPoints :::: pabrik di CAMediaTimingFunction (ada metode initWithControlPoints :::: init yang sesuai juga). Apa yang dilakukannya adalah membuat kurva Bézier untuk fungsi pengaturan waktu Anda. Ini bukan kurva yang berubah-ubah, tetapi kurva Bézier sangat kuat dan fleksibel. Dibutuhkan sedikit latihan untuk memahami poin kontrol. Tip: kebanyakan program menggambar dapat membuat kurva Bézier. Bermain dengan itu akan memberi Anda umpan balik visual pada kurva yang Anda wakili dengan titik kontrol.
The link ini poin untuk dokumentasi apel. Ada bagian singkat tapi berguna tentang bagaimana fungsi pra-bangun dibangun dari kurva.
Edit: Kode berikut menunjukkan animasi pantulan sederhana. Untuk melakukannya, saya membuat fungsi pengaturan waktu ( nilai dan pengaturan waktu properti NSArray) dan memberi setiap segmen animasi panjang waktu yang berbeda ( properti keytimes ). Dengan cara ini Anda dapat membuat kurva Bézier untuk membuat pengaturan waktu yang lebih canggih untuk animasi. Ini adalah artikel bagus tentang jenis animasi ini dengan kode contoh yang bagus.
sumber
Tidak yakin apakah Anda masih mencari, tetapi PRTween terlihat cukup mengesankan dalam hal kemampuannya untuk melampaui apa yang Core Animation berikan di luar kotak, terutama, fungsi pengaturan waktu khusus. Itu juga dikemas dengan banyak — jika tidak semua — kurva easing populer yang disediakan oleh berbagai kerangka web.
sumber
Implementasi versi cepat adalah TFAnimation . Demo adalah animasi kurva sin . Gunakan
TFBasicAnimation
sepertiCABasicAnimation
kecuali assigntimeFunction
dengan blok selaintimingFunction
.Kuncinya adalah subclass
CAKeyframeAnimation
dan menghitung posisi frame dengantimeFunction
dalam1 / 60fps
interval s. Setelah semua tambahkan semua nilai yang dihitung kevalues
dariCAKeyframeAnimation
dan waktu dengan intervalkeyTimes
juga.sumber
Saya membuat pendekatan berbasis blok, yang menghasilkan grup animasi, dengan banyak animasi.
Setiap animasi, per properti, dapat menggunakan 1 dari 33 kurva parametrik yang berbeda, fungsi pengaturan waktu Peluruhan dengan kecepatan awal, atau pegas khusus yang dikonfigurasi sesuai kebutuhan Anda.
Setelah grup dibuat, itu di-cache di Tampilan, dan dapat dipicu menggunakan AnimationKey, dengan atau tanpa animasi. Setelah dipicu, animasi akan disinkronkan sesuai dengan nilai lapisan presentasi, dan diterapkan sesuai dengan itu.
Kerangka tersebut dapat ditemukan di sini FlightAnimator
Berikut contohnya di bawah ini:
Untuk memicu animasi
sumber