iOS動畫 CABaseAnimation總結
最近有些無聊,無意之中又發現了一個好玩的東西,就是新增到購物車的動畫~ 額,好高大上啊,相比我之前用的動畫,感覺就是山寨與正品的差距啊 T T
這是我之前習慣用的 T T
原諒我之前年少無知 - -
[UIView animateWithDuration:耗時 animations:^{
// 動畫
} completion:^(BOOL finished) {
// 動畫完成後要做的事
}];
1.CABasicAnimation
簡單介紹下基本概念
CALayer
CALayer是個與UIView很類似的概念,同樣有backgroundColor、frame等相似的屬性,我們可以將UIView看做一種特殊的CALayer。但實際上UIView是對CALayer封裝,在CALayer的基礎上再新增互動功能。UIView的顯示必須依賴於CALayer。我們同樣可以跟新建view一樣新建一個layer,然後新增到某個已有的layer上,同樣可以對layer調整大小、位置、透明度等。一般來說,layer可以有兩種用途:一是對view相關屬性的設定,包括圓角、陰影、邊框等引數;二是實現對view的動畫操控。 因此對一個view進行動畫,本質上是對該view的.layer進行動畫操縱。
CAAnimation
CAAnimation可以分為以下幾類:
CABasicAnimation基礎動畫,通過設定起始點,終點,時間,動畫會沿著你這設定點進行移動。可以看做特殊的CAKeyFrameAnimation
CAKeyframeAnimation關鍵幀動畫,可定製度比CABasicAnimation高,也是本系列的接下來的內容
使用方法animationWithKeyPath:對 CABasicAnimation進行例項化,並指定Layer的屬性作為關鍵路徑進行註冊。
CAAnimationGroup
CAAnimationGroup組動畫,支援多個CABasicAnimation或者CAKeyframeAnimation動畫同時執行
例項化
屬性 | 說明 |
---|---|
Autoreverses | 動畫結束時是否執行逆動畫,通俗的說就是回放- - |
Duration | 動畫執行的時間 |
RemovedOnCompletion | 動畫執行完畢後,圖層會保持顯示動畫執行後的狀態,圖層動畫屬性被移除,圖層的屬性值還是動畫執行前的初始值,並沒有真正被改變。 |
FillMode | 這個屬性一般和 RemovedOnCompletion 配合使用,保持動畫狀態。其中kCAFillModeForwards 當動畫結束後,layer會一直保持著動畫最後的狀態.此時將RemovedOnCompletion設為NO |
Speed | 動畫執行速度 |
RepeatCount | 動畫重複次數 |
RepeatDuration | 動畫重複執行的時間段 |
FromValue | 動畫執行的初始值 |
ToValue | 動畫執行的效果值 |
ByValue | 所改變屬性相同起始值的改變數 |
TimingFunction | 控制動畫的顯示節奏系統提供五種值選擇,分別是: 1.kCAMediaTimingFunctionLinear 線性動畫 2.kCAMediaTimingFunctionEaseIn 先慢後快 3.kCAMediaTimingFunctionEaseOut 先快後慢 4.kCAMediaTimingFunctionEaseInEaseOut 先慢後快再慢 5.kCAMediaTimingFunctionDefault 預設,也屬於中間比較快 |
BeginTime | 可以用來設定動畫延遲執行時間,若想延遲1s,就設定為CACurrentMediaTime()+1,CACurrentMediaTime()為圖層的當前時間 |
解釋:為什麼動畫結束後返回原狀態?首先我們需要搞明白一點的是,layer動畫執行的過程是怎樣的?其實在我們給一個檢視新增layer動畫時,真正移動並不是我們的檢視本身,而是 presentation layer 的一個快取。動畫開始時 presentation layer開始移動,原始layer隱藏,動畫結束時,presentation layer從螢幕上移除,原始layer顯示。這就解釋了為什麼我們的檢視在動畫結束後又回到了原來的狀態,因為它根本就沒動過。
簡單小栗子
// 這的key是設定不同效果的動畫,下面有整理
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
// 平移動畫
animation.fromValue = [NSValue valueWithCGPoint:CGPointMake(0, HEIGHT/2 - 75)];
animation.toValue = [NSValue valueWithCGPoint:CGPointMake(WIDTH, HEIGHT/2 - 75)];
animation.duration = 3.0f;
// 這的key可以區分不同不同的動畫,在動畫完成回撥時可已經判斷等操作
[_demoView.layer addAnimation:anima forKey:@"positionAnimation"];
動畫開始和結束時的事件為了獲取動畫的開始和結束事件,需要實現協議
animation.delegate = self;
//動畫開始時
- (void)animationDidStart:(CAAnimation *)anim
{
if ([anim isEqual:[self.imageView.layer animationForKey:@"positionAnimation"]])
{
NSLog(@"平移動畫執行了");
}
}
//動畫結束時
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
//方法中的flag引數表明了動畫是自然結束還是被打斷,比如呼叫了removeAnimationForKey:方法或removeAnimationForKey方法,flag為NO,如果是正常結束,flag為YES。
NSLog(@"結束了");
}
下面是一些常用的animationWithKeyPath值的總結
屬性 | 說明 | 使用 |
---|---|---|
transform.scale | 比例轉換 | @(0.8) |
transform.scale.x | 寬的比例 | @(0.8) |
transform.scale.y | 高的比例 | @(0.8) |
transform.rotation.x | 圍繞x軸旋轉 | @(M_PI) |
transform.rotation.y | 圍繞y軸旋轉 | @(M_PI) |
transform.rotation.z | 圍繞z軸旋轉 | @(M_PI) |
cornerRadius | 圓角的設定 | @(50) |
backgroundColor | 背景顏色的變化 | (id)[UIColor purpleColor].CGColor |
bounds | 大小,中心不變 | [NSValue valueWithCGRect:CGRectMake(0, 0, 200, 200)]; |
position | 位置(中心點的改變) | [NSValue valueWithCGPoint:CGPointMake(300, 300)]; |
contents | 內容,比如UIImageView的圖片 | imageAnima.toValue = (id)[UIImage imageNamed:@”to”].CGImage; |
opacity | 透明度 | @(0.7) |
contentsRect.size.width | 橫向拉伸縮放 | @(0.4)最好是0~1之間的 |
2.CAAnimationGroup
不多說,直接上栗子
// 軌跡動畫
CAKeyframeAnimation *animation1 = [CAKeyframeAnimation animationWithKeyPath:@"position"];
// 縮放動畫
CABasicAnimation *animation2 = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
// 旋轉動畫
CABasicAnimation *animation3 = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
NSValue *value0 = [NSValue valueWithCGPoint:CGPointMake(0, HEIGHT/2-50)];
NSValue *value1 = [NSValue valueWithCGPoint:CGPointMake(WIDTH/3, HEIGHT/2-50)];
NSValue *value2 = [NSValue valueWithCGPoint:CGPointMake(WIDTH/3, HEIGHT/2+50)];
NSValue *value3 = [NSValue valueWithCGPoint:CGPointMake(WIDTH*2/3, HEIGHT/2+50)];
NSValue *value4 = [NSValue valueWithCGPoint:CGPointMake(WIDTH*2/3, HEIGHT/2-50)];
NSValue *value5 = [NSValue valueWithCGPoint:CGPointMake(WIDTH, HEIGHT/2-50)];
// values:就是上述的NSArray物件。裡面的元素稱為”關鍵幀”(keyframe)。動畫物件會在指定的時間(duration)內,依次顯示values陣列中的每一個關鍵幀
animation1.values = [NSArray arrayWithObjects:value0,value1,value2,value3,value4,value5, nil];
animation2.fromValue = [NSNumber numberWithFloat:0.8f];
animation2.toValue = [NSNumber numberWithFloat:2.0f];
animation3.toValue = [NSNumber numberWithFloat:M_PI*4];
CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
animationGroup.animations = @[animation1, animation2, animation3];
animationGroup.duration = 4.0f;
[_imageView.layer addAnimation:animationGroup forKey:@"groupAnimation"];
動畫組便是把一系列的動畫組成一個數組,然後執行
3.UIBezierPath
使用UIBezierPath可以建立基於向量的路徑,此類是Core Graphics框架關於路徑的封裝。使用此類可以定義簡單的形狀,如橢圓、矩形或者有多個直線和曲線段組成的形狀等。
UIBezierPath是CGPathRef資料型別的封裝。如果是基於向量形狀的路徑,都用直線和曲線去建立。我們使用直線段去建立矩形和多邊形,使用曲線去建立圓弧(arc)、圓或者其他複雜的曲線形狀。
// 軌跡動畫
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
// 圓形軌跡動畫
// path:可以設定一個CGPathRef\CGMutablePathRef,讓層跟著路徑移動。path只對CALayer的anchorPoint和position起作用。如果你設定了path,那麼values將被忽略。
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(WIDTH/2-100, HEIGHT/2-100, 200, 200)];
animation.path = path.CGPath;
animation.duration = 2.0f;
animation.fillMode = kCAFillModeForwards;
animation.removedOnCompletion = NO;
// 先慢後快
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
[_imageView.layer addAnimation:animation forKey:@"position"];
4.CATransition
CAAnimation的子類,用於做轉場動畫,能夠為層提供移出螢幕和移入螢幕的動畫效果。
- 建立轉場動畫
- 設定轉場型別、子型別以及其他屬性
- 設定轉場後的新檢視並新增動畫到圖層
動畫型別 | 說明 | 對應常量 | 是否支援方向設定 |
---|---|---|---|
公開API | |||
fade | 淡出效果 | kCATransitionFade | 是 |
movein | 新檢視移動到舊檢視上 | kCATransitionMoveIn | 是 |
push | 新檢視推出舊檢視 | kCATransitionPush | 是 |
reveal | 移開舊檢視顯示新檢視 | kCATransitionReveal | 是 |
私有API | |||
cube | 立方體翻轉效果 | 無 | 是 |
oglFlip | 翻轉效果 | 無 | 是 |
suckEffect | 收縮效果 | 無 | 否 |
rippleEffect | 水滴波紋效果 | 無 | 否 |
pageCurl | 向上翻頁效果 | 無 | 是 |
pageUnCurl | 向下翻頁效果 | 無 | 是 |
cameralIrisHollowOpen | 攝像頭開啟效果 | 無 | 否 |
cameraIrisHollowClose | 攝像頭關閉效果 | 無 | 否 |
動畫子型別 | 說明 |
---|---|
kCATransitionFromRight | 從右側轉場 |
kCATransitionFromLeft | 從左側轉場 |
kCATransitionFromTop | 從頂部轉場 |
kCATransitionFromBottom | 從底部轉場 |
最後
這裡只是簡單的說明了下一些簡單的概念,複雜的酷炫動畫需要各種組合,還需要你的想象力。沒事可以多多練習一下,將一個個簡單的動畫新增上~