ฉันกำลังสร้างภาพเคลื่อนไหวCALayer
ตามCGPath
(QuadCurve) ได้ดีทีเดียวใน iOS แต่ฉันต้องการใช้ฟังก์ชั่นการค่อยๆเปลี่ยนที่น่าสนใจกว่าที่Apple มีให้ (EaseIn / EaseOut ฯลฯ ) ตัวอย่างเช่นฟังก์ชันตีกลับหรือยืดหยุ่น
สิ่งเหล่านี้สามารถทำได้กับ MediaTimingFunction (bezier):
แต่ฉันต้องการสร้างฟังก์ชันจับเวลาที่ซับซ้อนกว่านี้ ปัญหาคือเวลาของสื่อดูเหมือนจะต้องใช้ลูกบาศก์เบซิเอร์ซึ่งไม่มีประสิทธิภาพเพียงพอที่จะสร้างเอฟเฟกต์เหล่านี้:
(ที่มา: sparrow-framework.org )
รหัสเพื่อสร้างดังกล่าวข้างต้นก็เพียงพอที่เรียบง่ายในกรอบอื่น ๆ ซึ่งจะทำให้เรื่องนี้น่าผิดหวังมาก โปรดทราบว่าเส้นโค้งกำลังทำแผนที่เวลาอินพุตกับเวลาเอาต์พุต (เส้นโค้ง Tt) ไม่ใช่เส้นโค้งตำแหน่งเวลา ยกตัวอย่างเช่นeaseOutBounce (T) = Tส่งกลับใหม่ที จากนั้นtจะถูกใช้เพื่อพล็อตการเคลื่อนไหว (หรือคุณสมบัติใด ๆ ที่เราควรทำให้เคลื่อนไหว)
ดังนั้นฉันต้องการสร้างแบบกำหนดเองที่ซับซ้อนCAMediaTimingFunction
แต่ฉันไม่รู้ว่าจะทำอย่างไรหรือถ้าเป็นไปได้? มีทางเลือกอื่นหรือไม่?
แก้ไข:
นี่คือตัวอย่างที่เป็นรูปธรรมในขั้นตอนต่างๆ น่าศึกษามาก :)
ฉันต้องการทำให้วัตถุเคลื่อนไหวตามเส้นจากจุดaถึงbแต่ฉันต้องการให้วัตถุนั้น "เด้ง" การเคลื่อนที่ไปตามเส้นโดยใช้เส้นโค้งความสะดวกออกด้านบน ซึ่งหมายความว่ามันจะเป็นไปตามเส้นตรงจากaถึงbแต่จะเร่งและชะลอตัวลงด้วยวิธีที่ซับซ้อนกว่าสิ่งที่เป็นไปได้โดยใช้ CAMediaTimingFunction ที่ใช้ bezier ในปัจจุบัน
ช่วยให้เส้นนั้นมีการเคลื่อนไหวของเส้นโค้งตามอำเภอใจที่ระบุด้วย CGPath มันควรจะยังคงเคลื่อนที่ไปตามเส้นโค้งนั้น แต่ควรเร่งความเร็วและชะลอตัวลงเช่นเดียวกับในตัวอย่างเส้น
ในทางทฤษฎีฉันคิดว่ามันควรจะเป็นดังนี้:
ช่วยอธิบายเส้นโค้งการเคลื่อนไหวเป็นคีย์เฟรมภาพเคลื่อนไหวย้าย (t) = Pที่เสื้อเป็นเวลา [0..1], Pคือตำแหน่งคำนวณได้ในเวลาที ดังนั้นย้าย (0)คืนตำแหน่งที่จุดเริ่มต้นของเส้นโค้งย้าย (0.5)ตรงกลางที่แน่นอนและย้าย (1)ที่จุดสิ้นสุด การใช้ฟังก์ชันจับเวลาtime (T) = tเพื่อให้ค่าtสำหรับการเคลื่อนที่ควรให้สิ่งที่ฉันต้องการ สำหรับเอฟเฟกต์การตีกลับฟังก์ชันจับเวลาควรส่งคืนค่าtเดียวกันสำหรับเวลา (0.8)และเวลา (0.8)(เป็นเพียงตัวอย่าง) เพียงแค่เปลี่ยนฟังก์ชันจับเวลาเพื่อให้ได้เอฟเฟกต์ที่แตกต่างกัน
(ใช่เป็นไปได้ที่จะทำการตีกลับบรรทัดโดยการสร้างและรวมส่วนของบรรทัดสี่ส่วนซึ่งกลับไปกลับมา แต่ก็ไม่ควรจำเป็นท้ายที่สุดมันเป็นเพียงฟังก์ชันเชิงเส้นธรรมดาที่จะจับคู่ค่าเวลากับตำแหน่ง)
ฉันหวังว่าฉันจะเข้าใจที่นี่