J'anime un CALayer
long a CGPath
(QuadCurve) assez bien sous iOS. Mais j'aimerais utiliser une fonction d'assouplissement plus intéressante que les quelques-unes fournies par Apple (EaseIn / EaseOut, etc.). Par exemple, un rebond ou une fonction élastique.
Ces choses sont possibles avec MediaTimingFunction (bezier):
Mais j'aimerais créer des fonctions de chronométrage plus complexes. Le problème est que la synchronisation des médias semble nécessiter un bezier cubique qui n'est pas assez puissant pour créer ces effets:
(source: sparrow-framework.org )
Le code pour créer ce qui précède est assez simple dans d'autres frameworks, ce qui rend cela très frustrant. Notez que les courbes mappent le temps d'entrée au temps de sortie (courbe Tt) et non les courbes temps-position. Par exemple, easOutBounce (T) = t renvoie un nouveau t . Ensuite, ce t est utilisé pour tracer le mouvement (ou toute propriété à animer).
Alors, j'aimerais créer une coutume complexe CAMediaTimingFunction
mais je ne sais pas comment faire ça, ou si c'est même possible? Existe-t-il des alternatives?
ÉDITER:
Voici un exemple concret en étapes. Très éducatif :)
Je veux animer un objet le long d'une ligne allant du point a au point b , mais je veux qu'il "rebondisse" son mouvement le long de la ligne en utilisant la courbe easOutBounce ci-dessus. Cela signifie qu'il suivra la ligne exacte de a à b , mais accélérera et décélérera d'une manière plus complexe que ce qui est possible en utilisant la fonction CAMediaTimingFunction actuelle basée sur Bezier.
Permet de faire de cette ligne tout mouvement de courbe arbitraire spécifié avec CGPath. Il doit toujours se déplacer le long de cette courbe, mais il doit accélérer et décélérer de la même manière que dans l'exemple de ligne.
En théorie, je pense que cela devrait fonctionner comme ceci:
Décrivons la courbe de mouvement comme un mouvement d' animation d'image clé (t) = p , où t est le temps [0..1], p est la position calculée au temps t . Ainsi, move (0) renvoie la position au début de la courbe, déplace (0,5) le milieu exact et déplace (1) à la fin. Utiliser une fonction de synchronisation time (T) = t pour fournir les valeurs t pour le mouvement devrait me donner ce que je veux. Pour un effet de rebond, la fonction de synchronisation doit renvoyer les mêmes valeurs t pour le temps (0,8) et le temps (0,8)(juste un exemple). Remplacez simplement la fonction de synchronisation pour obtenir un effet différent.
(Oui, il est possible de faire rebondir les lignes en créant et en joignant quatre segments de ligne qui vont et viennent, mais cela ne devrait pas être nécessaire. Après tout, c'est juste une simple fonction linéaire qui mappe les valeurs de temps aux positions.)
J'espère avoir un sens ici.