Je suis en train d'animer un CALayer
le long d'un CGPath
(QuadCurve) très bien dans iOS. Mais j'aimerais utiliser une fonction d'assouplissement plus intéressante que les quelques fonctions de type fourni par par Apple (EaseIn/EaseOut etc.). Par exemple, une fonction de rebondissement ou d'élasticité.
Ces choses sont possibles avec MediaTimingFunction (bézier) :
Mais j'aimerais créer fonctions de chronométrage qui sont plus complexes. Le problème est que la synchronisation des médias semble nécessiter un bézier cubique qui n'est pas assez puissant pour créer ces effets :
(source : <a href="http://wiki.sparrow-framework.org/_media/manual/transitions.png" rel="noreferrer">sparrow-framework.org </a>)
El code pour créer ce qui précède est assez simple dans d'autres frameworks, ce qui rend ceci très frustrant. Notez que les courbes sont des courbes de correspondance entre le temps d'entrée et le temps de sortie (courbe T-t) et non des courbes de temps-position. Par exemple, easeOutBounce(T) = t renvoie un nouveau t . Alors que t est utilisé pour tracer le mouvement (ou toute autre propriété que nous devons animer).
Donc, je voudrais créer un complexe personnalisé CAMediaTimingFunction
mais je n'ai aucune idée de comment faire, ou si c'est même possible ? Existe-t-il des alternatives ?
EDITAR:
Voici un exemple concret en plusieurs étapes. Très pédagogique :)
-
Je veux animer un objet le long d'une ligne à partir d'un point. a a b mais je veux qu'il "rebondisse" le long de la ligne en utilisant la courbe easeOutBounce ci-dessus. Cela signifie qu'il suivra la ligne exacte de a 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 CAMediaTimingFunction actuelle basée sur le bézier.
-
Faisons de cette ligne n'importe quel mouvement de courbe arbitraire spécifié avec CGPath. Elle devrait toujours se déplacer le long de cette courbe, mais elle devrait accélérer et décélérer de la même manière que dans l'exemple de la ligne.
En théorie, je pense que cela devrait fonctionner comme suit :
Décrivons la courbe de mouvement comme une animation par images clés. move(t) = p , donde t est le temps [0..1], p est la position calculée au moment t . Donc déplacer(0) renvoie la position au début de la courbe, déplacer(0.5) le milieu exact et move(1) à la fin. Utilisation d'une fonction de chronométrage temps(T) = t pour fournir le t valeurs pour déplacer devrait me donner ce que je veux. Pour un effet de rebond, la fonction de synchronisation devrait retourner la même chose t valeurs pour temps(0.8) y temps(0.8) (juste un exemple). Il suffit de remplacer la fonction de synchronisation pour obtenir un effet différent.
(Oui, il est possible de faire du rebondissement de ligne 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, il s'agit juste d'une simple fonction linéaire qui met en correspondance temps valeurs aux positions).
J'espère que je suis logique ici.
0 votes
Soyez conscient que (comme c'est souvent le cas sur le SO), cette une très vieille question dont les réponses sont maintenant très dépassées assurez-vous de faire défiler vers le bas les réponses actuelles étonnantes. (Très remarquable : cubic-bezier.com !)