IOS'ta CALayer
bir CGPath
(QuadCurve) güzel bir şekilde canlandırıyorum . Ancak Apple tarafından sağlanan birkaçından daha ilginç bir hareket hızı işlevi kullanmak istiyorum (EaseIn / EaseOut vb.). Örneğin, bir sıçrama veya elastik işlev.
MediaTimingFunction (bezier) ile aşağıdakileri yapmak mümkündür:
Ancak daha karmaşık olan zamanlama işlevleri oluşturmak istiyorum . Sorun şu ki, ortam zamanlaması bu efektleri yaratmak için yeterince güçlü olmayan kübik bir bezier gerektiriyor gibi görünüyor:
(kaynak: sparrow-framework.org )
Kod bu çok sinir bozucu kılan diğer çerçeveler içinde üzerindedir basit yeterince oluşturmak için. Eğrilerin, zaman-konum eğrileri değil, girdi süresini çıktı süresine (Tt eğrisi) eşlediğini unutmayın. Örneğin, easeOutBounce (T) = t yeni döner t . Sonra bu t , hareketi (veya canlandırmamız gereken özelliği) çizmek için kullanılır.
Öyleyse, karmaşık bir gelenek yaratmak istiyorum CAMediaTimingFunction
ama bunu nasıl yapacağım veya mümkün olup olmadığı konusunda hiçbir fikrim yok? Herhangi bir alternatif var mı?
DÜZENLE:
İşte adımlarla ilgili somut bir örnek. Çok eğitici :)
Noktanın bir hat boyunca bir nesne animasyon istediğiniz a için b , ama "sıçrama" için yukarıda easeOutBounce eğrisi kullanılarak hattı boyunca hareketini istiyorum. Bu araçlar ondan kesin çizgiyi takip edecek bir etmek b ama hızlandırmak ve mevcut Bezier tabanlı CAMediaTimingFunction kullanılarak mümkün olandan daha karmaşık bir şekilde yavaşlar.
Bu çizgiyi CGPath ile belirtilen herhangi bir gelişigüzel eğri hareketi yapalım. Yine de bu eğri boyunca hareket etmelidir, ancak çizgi örneğindekiyle aynı şekilde hızlanmalı ve yavaşlamalıdır.
Teorik olarak şöyle çalışması gerektiğini düşünüyorum:
Hareket eğrisini bir anahtar kare animasyon hareketi (t) = p olarak tanımlayalım , burada t zaman [0..1], p ise t zamanında hesaplanan konumdur . Dolayısıyla hareket (0) , eğrinin başlangıcındaki konumu döndürür , tam ortayı (0.5) hareket ettirin ve sonunda (1) hareket ettirin . Hareket için t değerlerini sağlamak için bir zamanlama fonksiyonu kullanmak zaman (T) = t bana istediğimi vermelidir. Bir sıçrama etkisi için, zamanlama işlevi zaman (0.8) ve zaman (0.8) için aynı t değerlerini döndürmelidir.(sadece bir örnek). Farklı bir etki elde etmek için zamanlama işlevini değiştirmeniz yeterlidir.
(Evet, ileri geri giden dört çizgi parçası oluşturarak ve birleştirerek çizgi sıçrama yapmak mümkündür, ancak bu gerekli olmamalıdır. Sonuçta, zaman değerlerini konumlara eşleyen basit bir doğrusal işlevdir .)
Umarım burada mantıklıyımdır.