4

J'anime une vue entre deux points en utilisant UIViewAnimationCurveLinear, donc je connais la vélocité de cette animation. Dans certaines circonstances, je veux ajouter un UIViewAnimationCurveEaseOut pour ralentir la vue. Pour rendre cet effet homogène, l'animation d'accélération doit commencer à la même vitesse que l'animation linéaire qui l'a précédée. Compte tenu d'une distance fixe sur laquelle je veux que cet assouplissement se produise, comment puis-je calculer la durée nécessaire pour atteindre cette vitesse de démarrage connue? Par exemple, disons que j'anime ma vue de x = 0 à x = 100 sur 10 secondes. La vélocité est donc de 10 pixels/seconde. Je veux maintenant que la vue décélère de x = 100 à x = 120 en utilisant une animation UIViewAnimationCurveEaseOut. Quelle devrait être la durée de cette animation pour s'assurer qu'elle commence à 10 pixels/seconde? Je crois comprendre que CAMediaTimingFunction de Core Animation contrôle la stimulation d'animation en utilisant des courbes de Bézier cubiques, où les deuxième et troisième points de contrôle dictent la forme de la courbe. Je suppose que les fonctions d'accélération UIViewAnimationCurve sont également des courbes de Bézier cubiques. Si je connaissais les points de contrôle par défaut utilisés par ces fonctions, je devrais pouvoir calculer la formule pour calculer la durée en fonction de la vitesse et de la distance, mais je n'ai pas réussi à trouver ces points de contrôle par défaut.Comment puis-je calculer la durée d'une animation UIViewAnimationCurveEaseOut avec une vitesse et une distance de départ connues?

+0

Pourquoi ne pas simplement utiliser EaseOut sur l'ensemble de l'animation? –

Répondre

1

Je ne pourrais peut-être pas vous donner une réponse complète, mais je peux vous diriger vers la méthode -getControlPointAtIndex: values: de CAMediaTimingFunction. Cela devrait vous permettre de créer une fonction de temporisation EaseOut, puis d'examiner ses points de contrôle.

Je vous dirigerai également vers un article by Matt Gallagher sur les courbes d'accélération personnalisées effectuées à l'aide de CAKeyframeAnimation, qui pourrait également vous être utile.

0

Vous pouvez utiliser une constante (appelez-la BEZIER_INTEGRAL_CONSTANT) qui se rapproche de l'intégrale de la courbe de Bézier pour une animation de 1 seconde à partir d'une vitesse de 1 pixel/seconde. Pour l'assouplissement linéaire, cette constante est 0.5. Pour UIViewAnimationCurveEaseOut, il s'agit de environ0.7. La formule en termes de durée est la suivante:

duration = distance/(velocity * BEZIER_INTEGRAL_CONSTANT) 

Pour exemple, lorsque la distance est de 20 pixels et la vitesse de départ est de 10 pixels/seconde, la durée doit être d'environ: 20/(10 * 0.7) = 2.9 seconds.