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.
la source
Réponses:
J'ai trouvé ça:
Cocoa with Love - Courbes d'accélération paramétriques dans Core Animation
Mais je pense que cela peut être rendu un peu plus simple et plus lisible en utilisant des blocs. Nous pouvons donc définir une catégorie sur CAKeyframeAnimation qui ressemble à ceci:
CAKeyframeAnimation + Parametric.h:
CAKeyframeAnimation + Parametric.m:
Maintenant, l'utilisation ressemblera à ceci:
Je sais que ce n'est peut-être pas aussi simple que ce que vous vouliez, mais c'est un début.
la source
À partir d'iOS 10, il est devenu possible de créer plus facilement une fonction de synchronisation personnalisée en utilisant deux nouveaux objets de synchronisation.
1) UICubicTimingParameters permet de définir la courbe de Bézier cubique comme fonction d' accélération .
ou simplement en utilisant des points de contrôle lors de l'initialisation de l'animateur
Ce service génial va vous aider à choisir des points de contrôle pour vos courbes.
2) UISpringTimingParameters permet aux développeurs de manipuler le rapport d'amortissement , la masse , la rigidité et la vitesse initiale pour créer le comportement de ressort souhaité.
Le paramètre de durée est toujours présenté dans Animator, mais sera ignoré pour la synchronisation du printemps.
Si ces deux options ne suffisent pas, vous pouvez également implémenter votre propre courbe de synchronisation en confirmant au protocole UITimingCurveProvider .
Plus de détails, comment créer des animations avec différents paramètres de synchronisation, vous pouvez trouver dans la documentation .
Veuillez également consulter la présentation Advances in UIKit Animations and Transitions de la WWDC 2016.
la source
CoreAnimation
version deUISpringTimingParameters
(CASpringAnimation
) est prise en charge vers iOS 9!UITimingCurveProvider
non seulement de représenter une animation cubique ou de ressort, mais aussi de représenter une animation qui combine à la fois cubique et ressort viaUITimingCurveType.composed
.Un moyen de créer une fonction de minutage personnalisée consiste à utiliser la méthode d'usine functionWithControlPoints :::: dans CAMediaTimingFunction (il existe également une méthode initWithControlPoints :::: init correspondante). Cela crée une courbe de Bézier pour votre fonction de chronométrage. Ce n'est pas une courbe arbitraire, mais les courbes de Bézier sont très puissantes et flexibles. Il faut un peu de pratique pour maîtriser les points de contrôle. Un conseil: la plupart des programmes de dessin peuvent créer des courbes de Bézier. Jouer avec ceux-ci vous donnera un retour visuel sur la courbe que vous représentez avec les points de contrôle.
Ce lien pointe vers la documentation d'Apple. Il existe une section courte mais utile sur la façon dont les fonctions de pré-construction sont construites à partir de courbes.
Edit: Le code suivant montre une simple animation de rebond. Pour ce faire, j'ai créé une fonction de synchronisation composée ( valeurs et propriétés de synchronisation NSArray) et donné à chaque segment de l'animation une durée différente ( propriété keytimes ). De cette façon, vous pouvez composer des courbes de Bézier pour composer un timing plus sophistiqué pour les animations. C'est un bon article sur ce type d'animations avec un bon exemple de code.
la source
Je ne sais pas si vous cherchez toujours, mais PRTween semble assez impressionnant en termes de capacité à aller au-delà de ce que Core Animation vous offre prêt à l'emploi , notamment des fonctions de synchronisation personnalisées. Il est également livré avec un grand nombre, sinon la totalité, des courbes d'assouplissement populaires fournies par divers frameworks Web.
la source
Une implémentation de version rapide est TFAnimation . La démo est une animation de courbe de péché . Utilisez
TFBasicAnimation
juste commeCABasicAnimation
except assigntimeFunction
avec un bloc autre quetimingFunction
.Le point clé est la sous - classe
CAKeyframeAnimation
et de calculer la position des cadres partimeFunction
dans l'1 / 60fps
intervalle s .Après tout ajouter toute la valeur calculée àvalues
desCAKeyframeAnimation
et les temps par intervallekeyTimes
trop.la source
J'ai créé une approche basée sur des blocs, qui génère un groupe d'animation, avec plusieurs animations.
Chaque animation, par propriété, peut utiliser 1 des 33 courbes paramétriques différentes, une fonction de minutage de déclin avec une vitesse initiale ou un ressort personnalisé configuré selon vos besoins.
Une fois le groupe généré, il est mis en cache sur la vue et peut être déclenché à l'aide d'une animationKey, avec ou sans l'animation. Une fois déclenchée, l'animation est synchronisée en fonction des valeurs de la couche de présentation et appliquée en conséquence.
Le cadre peut être trouvé ici FlightAnimator
Voici un exemple ci-dessous:
Pour déclencher l'animation
la source