Estoy animando a lo CALayer
largo de CGPath
(QuadCurve) bastante bien en iOS. Pero me gustaría usar una función de aceleración más interesante que las pocas proporcionadas por Apple (EaseIn / EaseOut, etc.). Por ejemplo, una función de rebote o elástica.
Estas cosas se pueden hacer con MediaTimingFunction (bezier):
Pero me gustaría crear funciones de sincronización que sean más complejas. El problema es que el tiempo de los medios parece requerir un bezier cúbico que no es lo suficientemente poderoso como para crear estos efectos:
(fuente: sparrow-framework.org )
El código para crear lo anterior es bastante simple en otros marcos, lo que hace que esto sea muy frustrante. Tenga en cuenta que las curvas están mapeando el tiempo de entrada al tiempo de salida (curva Tt) y no las curvas de tiempo-posición. Por ejemplo, easyOutBounce (T) = t devuelve una nueva t . Entonces esa t se usa para trazar el movimiento (o cualquier propiedad que debamos animar).
Entonces, me gustaría crear una costumbre compleja CAMediaTimingFunction
pero no tengo ni idea de cómo hacerlo, o si es posible. ¿Existen alternativas?
EDITAR:
Aquí hay un ejemplo concreto en pasos. Muy educativo :)
Quiero animar un objeto a lo largo de una línea desde el punto a al b , pero quiero que "rebote" su movimiento a lo largo de la línea usando la curva easyOutBounce anterior. Esto significa que seguirá la línea exacta de a a b , pero acelerará y desacelerará de una manera más compleja de lo que es posible usando la actual función CAMediaTimingFunction basada en bezier.
Hagamos de esa línea cualquier movimiento de curva arbitrario especificado con CGPath. Aún debería moverse a lo largo de esa curva, pero debería acelerar y desacelerar de la misma manera que en el ejemplo de línea.
En teoría, creo que debería funcionar así:
Vamos a describir la curva de movimiento como un movimiento de animación de fotogramas clave (t) = p , donde t es el tiempo [0..1], p es la posición calculada en el tiempo t . Así que move (0) devuelve la posición al inicio de la curva, mueve (0.5) el centro exacto y mueve (1) al final. Usar una función de temporización time (T) = t para proporcionar los valores de t para move debería darme lo que quiero. Para un efecto de rebote, la función de sincronización debe devolver los mismos valores t para el tiempo (0.8) y el tiempo (0.8)(solo un ejemplo). Simplemente reemplace la función de sincronización para obtener un efecto diferente.
(Sí, es posible hacer un rebote de línea creando y uniendo cuatro segmentos de línea que van y vienen, pero eso no debería ser necesario. Después de todo, es solo una función lineal simple que asigna valores de tiempo a posiciones).
Espero tener sentido aquí.