2010-07-15 83 views
3

說我要到球滾動1000個像素動畫的權利,在這個過程中指定計時功能 - 是這樣的:CAAnimation在週期性動畫進度間隔中調用方法?

UIView *ball = [[UIView alloc] initWithFrame:CGRectMake(0,0,30,30)]; 
CABasicAnimation* anim = 
     [CABasicAnimation animationWithKeyPath:@"transform.translation.x"]; 
anim.toValue = [NSNumber numberWithFloat:ball.frame.origin.x + 1000.0]; 
              // move 1000 pixels to the right 
anim.duration = 10.0; 
anim.timingFunction = [CAMediaTimingFunction functionWithControlPoints: 
         0.1 :0.0 :0.3 :1.0]; // accelerate fast, decelerate slowly 
[ball.layer addAnimation:anim forKey:@"myMoveRightAnim"]; 

我最終想是有一個方法,說-(void)animationProgressCallback:(float)progress,在動畫期間,在動畫的進度的規則間隔中,根據開始值和結束值之間的絕對「距離」,即忽略定時功能。

我會嘗試用球滾動1000像素到右邊上面的例子來解釋(以Y軸繪製,在我們的例子中100%= 1000像素):

alt text

我想我的回調方法在球進展250個像素時被調用。由於計時功能的原因,前250個像素可能會在達到= 2秒,達到總距離的一半ti = 0.7秒後(快速加速啓動),750px標記另一個ti = 1.1秒後,並且需要剩餘的時間= 5.2秒才能達到100%(1000px)標記。

會是什麼偉大的,但沒有提供:

如果動畫稱爲動畫正在進行間隔委託方法所描述的,我不會要問這個問題... ;-)

想法如何解決這個問題:

一個解決方案,我能想到的是計算貝塞爾曲線的價值觀,其映射到TI ķ值(我們知道總動畫持續時間),當動畫開始時,我們會手動按順序執行animationProgresssCallback:選擇器。顯然,這是瘋了(手工計算貝塞爾曲線??),更重要的是,不可靠(我們不能依賴動畫線程和主線程同步 - 或者我們可以嗎?)。

任何想法??

期待您的想法!

回答

1

想法如何解決這個問題:

一個解決方案,我能想到的是 計算貝塞爾曲線的價值觀, 映射到狄值(我們知道 總動畫持續時間),以及 動畫開始時,我們 依次執行我們的 animationProgresssCallback:選擇器 手動延遲。

顯然,這是瘋了(手工計算 bezier曲線?)和更多 重要的是,不可靠(我們不能依賴 在動畫線程和主要 線程同步 - 或我們可以嗎?)。

其實這是可靠的。 CoreAnimation是基於時間的,因此您可以在動畫真正開始時使用委託來通知。 關於計算貝塞爾路徑......以這種方式來看:如果你想在OpenGLES中實現一個曲面,你將不得不計算一個Cubic Bezier!,這可能會更糟糕。大聲笑。你的情況只是一個維度,如果你知道數學,那並不難。

+0

感謝您指出我不必擔心線程間同步。這鼓勵我按照我的建議去做。到目前爲止,它看起來不錯! – 2010-07-19 13:22:22