Core Animation2-CABasicAnimation


CABasicAnimationCAPropertyAnimation的子類,使用它可以實現一些基本的動畫效果,它可以讓CALayer的某個屬性從某個值漸變到另一個值。下面就用CABasicAnimation實現幾個簡單的動畫。

* 先初始化一個UIView添加到控制器的view中,然后在這個UIView的layer上執行動畫,下面的self是指控制器

1 _myView = [[UIView alloc] init];
2 _myView.layer.position = CGPointMake(100, 100);
3 _myView.layer.bounds = CGRectMake(0, 0, 100, 100);
4 _myView.backgroundColor = [UIColor blueColor];
5 [self.view addSubview:_myView];
6 [_myView release];

一、平移動畫

實現平移動畫有好幾種方法,這里列舉2種。

1.方法1

 1 // 說明這個動畫對象要對CALayer的position屬性執行動畫
 2 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position"];
 3 // 動畫持續1.5s
 4 anim.duration = 1.5; 
 5 
 6 // position屬性值從(50, 80)漸變到(300, 350)
 7 anim.fromValue = [NSValue valueWithCGPoint:CGPointMake(50, 80)];
 8 anim.toValue = [NSValue valueWithCGPoint:CGPointMake(300, 350)];
 9 
10 // 設置動畫的代理
11 anim.delegate = self;
12 
13 // 保持動畫執行后的狀態
14 anim.removedOnCompletion = NO;
15 anim.fillMode = kCAFillModeForwards;
16 
17 // 添加動畫對象到圖層上
18 [_myView.layer addAnimation:anim forKey:@"translate"];

* 第2行設置的keyPath是@"position",說明要修改的是CALayer的position屬性,也就是會執行平移動畫

* 注意第7、8行,這里並不是直接使用CGPoint這種結構體類型,而是要先包裝成NSValue對象后再使用。這2行代碼表示CALayer從位置(50, 80)移動到位置(300, 350)

* 如果將第8行的toValue換成byValue,代表CALayer從位置(50, 80)開始向右移動300、向下移動350,也就是移動到位置(350, 430)

* 默認情況下,動畫執行完畢后,動畫會自動從CALayer上移除,CALayer又會回到原來的狀態。為了保持動畫執行后的狀態,可以加入第14、15行代碼

* 第18行后面的@"translate"是給動畫對象起個名稱,以后可以調用CALayer的removeAnimationForKey:方法根據動畫名稱停止相應的動畫

* 第11行是設置動畫的代理,可以監聽動畫的執行過程,這里設置控制器為代理。代理需要實現的方法有:

 1 #pragma mark 動畫開始
 2 - (void)animationDidStart:(CAAnimation *)anim {
 3     NSLog(@"動畫開始了");
 4 }
 5 
 6 #pragma mark 動畫結束
 7 - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
 8     // 查看一下動畫執行完畢后的position值
 9     NSString *string = NSStringFromCGPoint(_myView.layer.position);
10     NSLog(@"動畫結束了,position:%@", string);
11 }

打印結果為:

1 2013-04-14 23:44:26.197 CAAnimation[5995:c07] 動畫開始了
2 2013-04-14 23:44:27.697 CAAnimation[5995:c07] 動畫結束了,position:{100, 100}

從第2行的打印信息可以看出,實際上,動畫執行完畢后,並沒有真正改變CALayer的position屬性的值

 

2.方法2

1 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
2 anim.duration = 1;
3 
4 CATransform3D form = CATransform3DMakeTranslation(350, 350, 0);
5 anim.toValue = [NSValue valueWithCATransform3D:form];
6 
7 [_myView.layer addAnimation:anim forKey:nil];

通過CALayer的transform屬性實現平移動畫,layer會從自己的初始位置平移到(350, 350)位置

 

二、縮放動畫

實現縮放動畫有好幾種方法,這里列舉2種。

1.方法1

1 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"bounds"];
2 anim.duration = 2;
3 
4 anim.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 30, 30)];
5 
6 [_myView.layer addAnimation:anim forKey:nil];

layer會從原來的尺寸(100x100)變為30x30

 

2.方法2

1 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
2 anim.duration = 1.5; // 動畫持續1.5s
3 
4 // CALayer的寬度從0.5倍變為2倍
5 // CALayer的高度從0.5倍變為1.5倍
6 anim.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.5, 0.5, 1)];
7 anim.toValue  = [NSValue valueWithCATransform3D:CATransform3DMakeScale(2, 1.5, 1)];
8 
9 [_myView.layer addAnimation:anim forKey:nil];

 

三、旋轉動畫

1 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
2 anim.duration = 1.5;
3 
4 // 繞着(0, 0, 1)這個向量軸順時針旋轉45°
5 anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_4, 0, 0, 1)];
6 
7 [_myView.layer addAnimation:anim forKey:nil]; 

其實可以不用設置fromValue,這里只設置了toValue

 

四、其他

* 除開前面使用的position、transform屬性,其實CALayer還有好多屬性都可以形成動畫,這些屬性統稱為"Animatable Properties"。在《CALayer3-層的屬性》開頭有介紹如何搜索這些屬性

* CABasicAnimation雖然能夠做很多基本的動畫效果,但是有個局限性,只能讓CALayer的屬性從某個值漸變到另一個值,僅僅是在2個值之間漸變


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM