Core Animation教程 關(guān)鍵楨動(dòng)畫實(shí)例操作
Core Animation教程 關(guān)鍵楨動(dòng)畫實(shí)例操作是本文要介紹的內(nèi)容,不多說(shuō),我們先來(lái)看內(nèi)容。實(shí)現(xiàn)動(dòng)畫的操作。
Leopard中***的Core Animation技術(shù)可以讓開(kāi)發(fā)者簡(jiǎn)單地開(kāi)發(fā)超酷的用戶界面。想想iPhone為什么這么受歡迎,因?yàn)樗锩缘挠脩艚缑婧陀脩趔w驗(yàn),可以讓人愛(ài)不釋手。在本站之前的文章里,我們介紹過(guò)一些關(guān)于Core Animation開(kāi)發(fā)方面的文章,但是從來(lái)沒(méi)有介紹過(guò)關(guān)于關(guān)鍵楨動(dòng)畫方面的內(nèi)容。
本文通過(guò)一個(gè)例子講解Core Animation關(guān)鍵楨動(dòng)畫方面的基本知識(shí),例子很清晰易懂。建議您有一定Cocoa知識(shí)以及掌握初步的Core Animation概念,那么通過(guò)本文您會(huì)了解更多關(guān)于Core Animation的知識(shí)
我最近進(jìn)行了一些關(guān)于關(guān)鍵楨動(dòng)畫方面的研究,感覺(jué)不錯(cuò)。關(guān)鍵楨動(dòng)畫其實(shí)是一個(gè)很酷的東西,因?yàn)樗鼈儠?huì)在你創(chuàng)建的層進(jìn)行動(dòng)作時(shí)給你提供更加精確的控制。基本動(dòng)畫在“開(kāi)始”和“結(jié)束”點(diǎn)之間進(jìn)行線性插值,在很多情況下,你都可以使用基本動(dòng)畫。但是有時(shí)候,如果你希望進(jìn)行一些不一樣或者更復(fù)雜的動(dòng)畫時(shí),基本動(dòng)畫就不夠用了。本文介紹的關(guān)鍵楨動(dòng)畫可以允許你在動(dòng)畫的過(guò)程中進(jìn)行精確控制。
與基本動(dòng)畫進(jìn)行線性插值不同,關(guān)鍵楨動(dòng)畫允許你在特定時(shí)間指定不同的數(shù)值,這樣你可以在動(dòng)畫的全過(guò)程控制動(dòng)畫的展示和動(dòng)作。
自從發(fā)明手繪電影以來(lái),關(guān)鍵楨就在動(dòng)畫中起到了一定作用。一些資深的藝術(shù)家會(huì)針對(duì)一個(gè)場(chǎng)景畫不同的關(guān)鍵楨,而一些剛?cè)胄械乃囆g(shù)家卻會(huì)填滿每一楨,以便使動(dòng)畫看起來(lái)更平滑。(有時(shí)候這個(gè)過(guò)程叫做tweening:兩者之間的動(dòng)畫)。Core Animation的關(guān)鍵楨動(dòng)畫可以幫我們實(shí)現(xiàn)在關(guān)鍵楨之間的填充,我們只需要指定哪個(gè)是關(guān)鍵楨,系統(tǒng)會(huì)自動(dòng)幫我們生成動(dòng)畫。
另外一個(gè)很酷的東西是,關(guān)鍵楨動(dòng)畫同樣可以完成任何基本動(dòng)畫能夠完成的動(dòng)作。特別是點(diǎn)、大小或是矩形。比如如果我們希望讓一個(gè)層的不透明度顯示為一個(gè)動(dòng)畫,我們可以指定一些不同的數(shù)值(比如:0.25, 0.50, 0.75),然后在動(dòng)畫的過(guò)程的不同時(shí)間中逐漸變化。
再一個(gè)真的很酷的方面,我們不光可以使用離散數(shù)值,更可以使用CGPath去指定關(guān)鍵楨動(dòng)畫的值。換句話說(shuō),我們不僅僅可以在特定時(shí)間點(diǎn)指定特定的動(dòng)畫值,還可以使用曲線路徑去指定動(dòng)畫的值。舉例說(shuō)明,我們可以將一個(gè)層的不透明度用鐘型曲線表示:開(kāi)始是透明,然后逐漸顯現(xiàn)到某個(gè)特定透明度,再逐漸變?yōu)橥该?。我們還可以用CGPoint和CGSize值的路徑做為動(dòng)畫的行進(jìn)路線。這樣,路徑的x值可以表示橫坐標(biāo)也可以表示寬度,y既可以表示縱坐標(biāo)還可以表示高度。
本例中,我們會(huì)畫一個(gè)在窗口中前后行進(jìn)的層,下面是截圖:
圖中白色的線是一條貝塞爾曲線,我們創(chuàng)建的層會(huì)通過(guò)這條曲線行進(jìn)。這條曲線畫的很簡(jiǎn)單,這樣我們就可以更容易看清楚細(xì)節(jié)。以下是創(chuàng)建路徑的代碼:
- CGMutablePathRef path = CGPathCreateMutable();
- CGPathMoveToPoint(path, NULL, _point1.x + _movieSize.width * 0.5f, _point1.y);
- CGPathAddCurveToPoint(path, NULL, _controlPoint1.x + _movieSize.width * 0.5f,
- _controlPoint1.y, _controlPoint2.x - _movieSize.width * 0.5f,
- _controlPoint2.y, _point2.x - _movieSize.width * 0.5f, _point2.y);
- if(NULL != _rightBoundKeyframePath) {
- CGPathRelease(_rightBoundKeyframePath);
- }
- _rightBoundKeyframePath = CGPathCreateCopy(path);
- CGPathRelease(path);
- path = CGPathCreateMutable();
- CGPathMoveToPoint(path, NULL, _point2.x - _movieSize.width * 0.5f, _point2.y);
就像你看到的一樣,這是一段很明了的Quartz路徑創(chuàng)建代碼。接下來(lái)我們用以下代碼將路徑放入關(guān)鍵楨動(dòng)畫中:
- CAKeyframeAnimation *animation = [CAKeyframeAnimation animation];
- animation.duration = 2.0f;
- if(YES == _atLeftEdge) {
- animation.path = _rightBoundKeyframePath;
- // the rotation mode causes the layer to rotate along with the slope of the path
- animation.rotationMode = kCAAnimationRotateAuto;
- }
- else {
- animation.path = _leftBoundKeyframePath;
- // since the path is reversed, rotate at 180 degrees off
- animation.rotationMode = kCAAnimationRotateAutoReverse;
- }
- _movieLayer.actions = [NSDictionary dictionaryWithObject:animation forKey:@"position"];
這樣一來(lái),無(wú)論層的位置如何改變,它都會(huì)沿著我們創(chuàng)建的曲線行進(jìn),而不是默認(rèn)的線性插值路徑了。這個(gè)例子中還有一些細(xì)節(jié)并未交代的特別清楚,但是這至少已經(jīng)幫助我們了解如何使用關(guān)鍵楨動(dòng)畫了。
點(diǎn)擊可下載代碼,你可以自己嘗試編譯,希望你喜歡。
小結(jié):Core Animation教程 關(guān)鍵楨動(dòng)畫實(shí)例操作的內(nèi)容介紹完了,希望本文對(duì)你有所幫助。