Ich animiere eine CALayer
entlang einer CGPath
(QuadCurve) ganz gut in iOS. Aber ich möchte eine interessantere Beschleunigungsfunktion als die wenigen verwenden , zur Verfügung gestellt von Apple (easeIn / easeOut usw.). Zum Beispiel eine Sprungkraft oder eine elastische Funktion.
Diese Dinge können mit MediaTimingFunction (bezier) gemacht werden:
Aber ich möchte Timing-Funktionen erstellen , die komplexer sind. Das Problem ist, dass für das Media-Timing ein kubischer Bezier erforderlich zu sein scheint, der nicht leistungsfähig genug ist, um diese Effekte zu erzielen:
(Quelle: sparrow-framework.org )
Der Code zum Erstellen des oben genannten ist in anderen Frameworks einfach genug, was dies sehr frustrierend macht. Beachten Sie, dass die Kurven die Eingabezeit der Ausgabezeit (Tt-Kurve) und nicht den Zeitpositionskurven zuordnen. Zum Beispiel gibt easOutBounce (T) = t ein neues t zurück . Dann wird dieses t verwendet, um die Bewegung zu zeichnen (oder welche Eigenschaft wir animieren sollten).
Ich möchte also einen komplexen benutzerdefinierten Benutzer erstellen CAMediaTimingFunction
, habe aber keine Ahnung, wie das geht oder ob es überhaupt möglich ist. Gibt es Alternativen?
BEARBEITEN:
Hier ist ein konkretes Beispiel für Schritte. Sehr lehrreich :)
Ich möchte ein Objekt entlang einer Linie von Punkt a nach b animieren , aber ich möchte, dass es seine Bewegung entlang der Linie mithilfe der obigen easyOutBounce-Kurve "abprallt". Dies bedeutet, dass es der exakten Linie von a nach b folgt , jedoch auf komplexere Weise beschleunigt und verzögert, als dies mit der aktuellen bezier-basierten CAMediaTimingFunction möglich ist.
Machen wir diese Linie zu einer beliebigen Kurvenbewegung, die mit CGPath angegeben wurde. Es sollte sich immer noch entlang dieser Kurve bewegen, aber es sollte auf die gleiche Weise wie im Linienbeispiel beschleunigen und abbremsen.
Theoretisch denke ich, dass es so funktionieren sollte:
Beschreiben wir die Bewegungskurve als Keyframe-Animationsbewegung (t) = p , wobei t die Zeit [0..1] und p die zum Zeitpunkt t berechnete Position ist . So bewegt (0) gibt die Position am Anfang der Kurve, bewegt (0,5) die exakten Mitte und Bewegung (1) am Ende. Die Verwendung einer Zeitfunktionszeit (T) = t zur Bereitstellung der t- Werte für die Bewegung sollte mir das geben, was ich will. Für einen Bouncing-Effekt sollte die Timing-Funktion die gleichen t- Werte für Zeit (0,8) und Zeit (0,8) zurückgeben.(nur ein Beispiel). Ersetzen Sie einfach die Timing-Funktion, um einen anderen Effekt zu erzielen.
(Ja, es ist möglich , Line-Prellen durch das Erstellen und Verbinden vier Liniensegmente zu tun , die hin und her geht, aber das sollte nicht notwendig sein. Denn es ist nur eine einfache lineare Funktion , die Karten Zeitwerte zu Positionen.)
Ich hoffe ich mache hier Sinn.