Sto animando abbastanza bene un CALayer
lungo a CGPath
(QuadCurve) in iOS. Ma mi piacerebbe usare una funzione di facilitazione più interessante delle poche fornite da Apple (EaseIn / EaseOut ecc.). Ad esempio, una funzione di rimbalzo o elastica.
Queste cose sono possibili con MediaTimingFunction (bezier):
Ma vorrei creare funzioni di temporizzazione più complesse. Il problema è che il tempismo dei media sembra richiedere un bezier cubico che non è abbastanza potente per creare questi effetti:
(fonte: sparrow-framework.org )
Il codice per creare quanto sopra è abbastanza semplice in altri framework, il che lo rende molto frustrante. Notare che le curve stanno mappando il tempo di input con il tempo di output (curva Tt) e non le curve di posizione-tempo. Ad esempio, easeOutBounce (T) = t restituisce una nuova t . Quindi quella t è usata per tracciare il movimento (o qualunque proprietà dovremmo animare).
Quindi, mi piacerebbe creare un custom complesso CAMediaTimingFunction
ma non ho la più pallida idea di come farlo, o se è anche possibile? Esistono alternative?
MODIFICARE:
Ecco un esempio concreto in to steps. Molto educativo :)
Voglio animare un oggetto lungo una linea dal punto a al punto b , ma voglio che "rimbalzi" il suo movimento lungo la linea usando la curva easeOutBounce sopra. Ciò significa che seguirà la linea esatta da a a b , ma accelererà e decelererà in un modo più complesso di quanto sia possibile utilizzando l'attuale CAMediaTimingFunction basata su Bézier.
Consente di rendere quella linea qualsiasi movimento arbitrario della curva specificato con CGPath. Dovrebbe comunque muoversi lungo quella curva, ma dovrebbe accelerare e decelerare allo stesso modo dell'esempio di linea.
In teoria penso che dovrebbe funzionare in questo modo:
Descriviamo la curva di movimento come un'animazione del fotogramma chiave move (t) = p , dove t è il tempo [0..1], p è la posizione calcolata al tempo t . Quindi sposta (0) restituisce la posizione all'inizio della curva, sposta (0,5) il centro esatto e sposta (1) alla fine. Usare una funzione di temporizzazione time (T) = t per fornire i valori t per lo spostamento dovrebbe darmi quello che voglio. Per un effetto di rimbalzo, la funzione di temporizzazione dovrebbe restituire gli stessi valori t per tempo (0,8) e tempo (0,8)(solo un esempio). Basta sostituire la funzione di temporizzazione per ottenere un effetto diverso.
(Sì, è possibile eseguire il rimbalzo della linea creando e unendo quattro segmenti di linea che vanno avanti e indietro, ma non dovrebbe essere necessario. Dopotutto, è solo una semplice funzione lineare che mappa i valori temporali alle posizioni.)
Spero di avere un senso qui.