Mit CAMediaTimingFunction zu berechnen Wert zum Zeitpunkt (t)
In Kakao/Touch, CAMediaTimingFunction stellt vier Kontrollpunkte, die angeben, eine kubische bezier-Kurve timing-Funktion. Für eine Anwendung, die ich Schreibe, ich würde gerne in der Lage, zu extrahieren, das Ergebnis sagte bezier-Kurve an einem beliebigen Zeitpunkt t (0 -> 1). Was ist verwirrend mich ist, dass, wenn ich sehe, wie dies tun, das Ergebnis ist eigentlich ein Punkt, nicht ein Skalar:
Jedoch, apples Implementierung der Ergebnisse in einen skalaren Wert (kannst du in der Grafik sehen Sie, zeichnen Sie x(t) vs t: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Animation_Types_Timing/Articles/Timing.html#//apple_ref/doc/uid/TP40006670-SW1 )
So hat Apple einfach zu ignorieren, die y-Koordinate des Ergebnis-und nur mit dem x? Dies scheint seltsam, weil dann würden Sie nicht brauchen, um pass-Kontrolle Punkte, sondern die Kontrolle Skalare als y ist, hätte keinen Einfluss auf das Ergebnis.
- Ich denke, ich könnte wahrscheinlich die Antwort auf Ihre Frage besser, wenn Sie expandieren konnte, auf den Kontext der Frage. Verwenden Sie CAMediaTimingFunction zu animieren etwas? Wenn dem so ist, ist es eine keyframe-animation?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinweis: ich bin kein Experte auf CoreAnimation. Dies ist nur mein Verständnis aus der Lektüre der Dokumentation, die Sie verlinkt haben.
Apple ist das mischen von Koordinatensystemen hier, die Schaffung einige Verwirrung.
x(t)
im Beispiel Grundstücke stellt eine Skalare Fortschreiten entlang einem Weg, nicht eine physische koordinieren.Den Steuerpunkten in CAMediaTimingFunction werden verwendet, um zu beschreiben, diese progression, nicht eine geometrische Punkte. Um die Verwirrung hinzuzufügen,
x
in die Punkte tatsächlich Karten zut
auf die Grundstücke undy
in die Punkte zux(t)
auf den Parzellen.Nehmen, das Grundstück für den
kCAMediaTimingFunctionEaseInEaseOut
als ein Beispiel, dieses Grundstück wäre etwa beschrieben durch die Kontrolle der Punkte (0,0), (0.5,0), (0.5,1), (1,1).CoreAnimation ist
CAMediaTimingFunction
tut, was Sie wollen, aber nicht aussetzen, immer mit 'y' für einen gegebenen 'x' für vielseitige animation () verwenden, sondern nur die feeds gelöst Werte gedeckt, um die animation-system unter der Haube.Brauchte ich es, mich so gebaut eine Klasse mit dem interface und Funktionen genau wie
CAMediaTimingFunction
, sondern mit den benötigten-valueForX:
Methode; Beispiel:Können Sie erstellen, ease-in, ease-out, ease-in-ease-out oder wirklich irgendwelche Kurven beschrieben werden kann, dass mit eine kubische Bézier-Kurve. Die Umsetzung ist die Mathematik basiert auf WebCore (WebKit), das ist vermutlich das, was CoreAnimation ist mit unter der Haube zu.
Genießen,
Raphael
animate...usingSpringWithDamping:..
)CASpringAnimation
ist ein einfaches Feder-solver. UIKit Dynamics, SpriteKit und SceneKit tatsächliche Nutzung der Echtzeit-Physik-engines, aber Core Animation berechnet alle keyframe-Werte im Voraus.Es ist bedauerlich, aber Core Animation nicht aussetzen seine internen Computer-Modell für die animation-timing. Was hingegen funktionierte wirklich gut für mich ist die Verwendung von Core Animation, um die Arbeit zu tun!
CALayer
zu dienen, als ein evaluator((0.0, 0.0), (1.0, 1.0))
isHidden
zutrue
speed
zu0.0
Wenn Sie möchten, auch bewerten, ob
CAMediaTimingFunction
erstellen Sie einen Verweis animation:Legen Sie die Referenz-Ebene
timeOffset
zu was auch immer normierte Eingangswert (D. H., zwischen0.0
und1.0
), den Sie auswerten möchten:Fragen für die Referenz-Schicht Präsentations-Schicht, und seine aktuellen Grenzen Ursprungs-x-Wert:
Im Grunde hast du mit Core Animation ausführen einer animation für eine unsichtbare Schicht. Aber die Schicht ist
speed
ist0.0
, damit es nicht den Fortschritt der animation an alle. MittimeOffset
wir können es manuell einstellen, wird die aktuelle position der animation dann seine presentation layer " der x-position. Dies ist der aktuelle wahrgenommenen Wert der Eigenschaft als getrieben von der animation.Es ist ein wenig unkonventionell, aber es gibt nichts hacky darüber. Es ist möglichst getreue Darstellung der output-Wert einer
CAMediaTimingFunction
wie Sie bekommen können, da Core Animation ist tatsächlich.Das einzige, was zu beachten ist, dass die Darstellung der Schichten sind in der Nähe Annäherungen der Werte auf dem Bildschirm dargestellt. Core Animation übernimmt keine Gewähr für Ihre Richtigkeit, aber in all meinen Jahren der Verwendung von Core Animation, ich habe nie gesehen, dass es ungenau ist. Noch, wenn Ihre Anwendung erfordert absolute Genauigkeit, ist es möglich, diese Technik vielleicht nicht die beste.
Beste Tipp wäre wohl UnitBezier.h in WebKit source code. In der Tat, ich denke, Apple verwendet den gleichen code, der in Core Animation.
Mehr langwierig, die Sie verwenden, berechnen Sie den parameter
t
(hat nichts zu tun mit der Zeit) ein Wert vonx
die enthält tatsächlich die Zeit Wert. Dann verwenden Sie Newton-Raphson-Methode (zusätzliche Erklärung mit Beispielen). Da kann es scheitern, Sie Durchlaufen ein bisschen mehr mit bisection ("Teile und herrsche"). Sehen Sie insolveCurveX()
Methode.Nachdem erste parameter
t
(was notwendig ist, gegeben, dass die kubische Béziers sind Parametrisch definiert), die Sie einfach verwenden Sie es zu berechneny
. Sehen Sie insolve()
Methode.Übrigens ein großer fan von Cappuccino, und die, die noch Hoffnung für ein release von Atlas 🙂