en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

5.27.2011

CABasicAnimation 的暫停與恢復

 

延續前一篇 CABasicAnimation 的基本寫法一文,這次要示範如在動畫執行期間實做暫停與恢復的效果,沿用先前的程式碼,在介面上多加一個 UISwitch,目的是用來控制動畫的暫停與播放,其按鈕事件的程式碼如下。

//暫停與恢復
- (IBAction)onPlaySwitch:(id)sender {

if (!playSwitch.on) {

    //暫停時紀錄目前執行時間
    CFTimeInterval pausedTime = [imageView.layer convertTime:CACurrentMediaTime() fromLayer:nil];
    imageView.layer.timeOffset = pausedTime;

    //停止動作
    imageView.layer.speed = 0.0;
    }

else {

    //取得先前的停止時間
    CFTimeInterval pausedTime = [imageView.layer timeOffset];

    //開始動作
    imageView.layer.speed = 1.0;

    //計算並設定時間偏移量
    CFTimeInterval timeSincePause = [imageView.layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
    imageView.layer.beginTime = timeSincePause;
    }
}

上述程式碼在按鈕狀態為 OFF 時,會將動畫暫停,並將目前以執行的時間暫存於 timeOffset 中,以便稍後恢復動畫時計算時間的偏移量,而在按鈕狀態為 ON 時,先取得先前紀錄的最後執行時間,並在開始動畫之後計算時間偏移量,最後才設定動畫開始的時間,這邊要注意恢復動畫的程式碼順序不能任意調換,因為只有在開始動畫之後才有辦法取得執行時間,也才能夠計算時間偏移量。

最後,在此範例中其實並未真正停止動畫,也就是設定 Timer,我們只是將動畫速度 speed 設定成 0 讓使用者誤以為動畫已經停止了,其實 Timer 還是繼續在執行,之後再將 speed 參數設定為正常速度 1.0,利用時間偏移量的概念重新計算暫停時間的偏移量好繼續動畫。






沒有留言:

張貼留言