Ja animowania CALayer
wzdłuż CGPath
(QuadCurve) całkiem ładnie w iOS. Ale chciałbym użyć ciekawszej funkcji wygładzania niż kilka dostarczonych przez Apple (EaseIn / EaseOut itp.). Na przykład funkcja odbijania lub elastyczności.
Te rzeczy można zrobić z MediaTimingFunction (bezier):
Ale chciałbym stworzyć bardziej złożone funkcje czasowe . Problem polega na tym, że synchronizacja mediów wydaje się wymagać sześciennego beziera, który nie jest wystarczająco silny, aby stworzyć takie efekty:
(źródło: sparrow-framework.org )
Kod , aby utworzyć powyżej jest dość proste w innych ram, co sprawia, że to bardzo frustrujące. Należy zauważyć, że krzywe odwzorowują czas wejściowy do czasu wyjściowego (krzywa Tt), a nie krzywe czas-pozycja. Na przykład, easyOutBounce (T) = t zwraca nowe t . Następnie to t jest używane do wykreślenia ruchu (lub jakiejkolwiek właściwości, którą powinniśmy ożywić).
Chciałbym więc stworzyć złożony zwyczaj, CAMediaTimingFunction
ale nie mam pojęcia, jak to zrobić, a jeśli to w ogóle możliwe? Czy są jakieś alternatywy?
EDYTOWAĆ:
Oto konkretny przykład kroków. Bardzo pouczające :)
Chcę animować obiekt wzdłuż linii od punktu a do b , ale chcę, aby „odbijał” swój ruch wzdłuż linii, używając krzywej EasyOutBounce powyżej. Oznacza to, że będzie podążał dokładnie za linią od a do b , ale będzie przyspieszać i zwalniać w bardziej złożony sposób niż jest to możliwe przy użyciu obecnej funkcji CAMediaTimingFunction opartej na bezierze.
Zróbmy dla tej linii dowolny dowolny ruch krzywej określony przez CGPath. Powinien nadal poruszać się wzdłuż tej krzywej, ale powinien przyspieszać i zwalniać w taki sam sposób, jak na przykładzie linii.
Teoretycznie myślę, że powinno to działać tak:
Opiszmy krzywą ruchu jako animację ruchu klatki kluczowej (t) = p , gdzie t to czas [0..1], p to pozycja obliczona w czasie t . Zatem move (0) zwraca pozycję na początku krzywej, przesuwa (0,5) dokładnie w środku i przesuwa (1) na końcu. Użycie funkcji pomiaru czasu time (T) = t do podania wartości t dla ruchu powinno dać mi to, czego chcę. Aby uzyskać efekt odbijania, funkcja pomiaru czasu powinna zwracać te same wartości t dla czasu (0,8) i czasu (0,8)(tylko przykład). Wystarczy wymienić funkcję pomiaru czasu, aby uzyskać inny efekt.
(Tak, odbijanie linii można wykonać, tworząc i łącząc cztery segmenty linii, które poruszają się tam iz powrotem, ale nie powinno to być konieczne. W końcu jest to tylko prosta funkcja liniowa, która odwzorowuje wartości czasu na pozycje.)
Mam nadzieję, że mam tutaj sens.