本文目錄
CABasicAnimation是CAPropertyAnimation的子類,使用它可以實現(xiàn)一些基本的動畫效果,它可以讓CALayer的某個屬性從某個值漸變到另一個值。下面就用CABasicAnimation實現(xiàn)幾個簡單的動畫。
* 先初始化一個UIView添加到控制器的view中,然后在這個UIView的layer上執(zhí)行動畫,下面的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];
一、平移動畫
實現(xiàn)平移動畫有好幾種方法,這里列舉2種。
1.方法1
1//說明這個動畫對象要對CALayer的position屬性執(zhí)行動畫2CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position"];3//動畫持續(xù)1.5s4anim.duration=1.5;56//position屬性值從(50, 80)漸變到(300, 350)7anim.fromValue= [NSValue valueWithCGPoint:CGPointMake(50,80)];8anim.toValue= [NSValue valueWithCGPoint:CGPointMake(300,350)];910//設(shè)置動畫的代理11anim.delegate=self;1213//保持動畫執(zhí)行后的狀態(tài)14anim.removedOnCompletion=NO;15anim.fillMode=kCAFillModeForwards;1617//添加動畫對象到圖層上18[_myView.layer addAnimation:anim forKey:@"translate"];
* 第2行設(shè)置的keyPath是@"position",說明要修改的是CALayer的position屬性,也就是會執(zhí)行平移動畫
* 注意第7、8行,這里并不是直接使用CGPoint這種結(jié)構(gòu)體類型,而是要先包裝成NSValue對象后再使用。這2行代碼表示CALayer從位置(50, 80)移動到位置(300, 350)
* 如果將第8行的toValue換成byValue,代表CALayer從位置(50, 80)開始向右移動300、向下移動350,也就是移動到位置(350, 430)
* 默認(rèn)情況下,動畫執(zhí)行完畢后,動畫會自動從CALayer上移除,CALayer又會回到原來的狀態(tài)。為了保持動畫執(zhí)行后的狀態(tài),可以加入第14、15行代碼
* 第18行后面的@"translate"是給動畫對象起個名稱,以后可以調(diào)用CALayer的removeAnimationForKey:方法根據(jù)動畫名稱停止相應(yīng)的動畫
* 第11行是設(shè)置動畫的代理,可以監(jiān)聽動畫的執(zhí)行過程,這里設(shè)置控制器為代理。代理需要實現(xiàn)的方法有:
1#pragmamark 動畫開始2- (void)animationDidStart:(CAAnimation *)anim {3NSLog(@"動畫開始了");4}56#pragmamark 動畫結(jié)束7- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {8//查看一下動畫執(zhí)行完畢后的position值9NSString *string=NSStringFromCGPoint(_myView.layer.position);10NSLog(@"動畫結(jié)束了,position:%@",string);11}
打印結(jié)果為:
12013-04-1423:44:26.197CAAnimation[5995:c07] 動畫開始了22013-04-1423:44:27.697CAAnimation[5995:c07] 動畫結(jié)束了,position:{100,100}
從第2行的打印信息可以看出,實際上,動畫執(zhí)行完畢后,并沒有真正改變CALayer的position屬性的值!
2.方法2
1CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];2anim.duration =1;34CATransform3Dform =CATransform3DMakeTranslation(350,350,0);5anim.toValue=[NSValue valueWithCATransform3D:form];67[_myView.layer addAnimation:anim forKey:nil];
通過CALayer的transform屬性實現(xiàn)平移動畫,layer會從自己的初始位置平移到(350, 350)位置
二、縮放動畫
實現(xiàn)縮放動畫有好幾種方法,這里列舉2種。
1.方法1
1CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"bounds"];2anim.duration =2;34anim.toValue = [NSValue valueWithCGRect:CGRectMake(0,0,30,30)];56[_myView.layer addAnimation:anim forKey:nil];
layer會從原來的尺寸(100x100)變?yōu)?0x30
2.方法2
1CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];2anim.duration =1.5;//動畫持續(xù)1.5s34//CALayer的寬度從0.5倍變?yōu)?倍5//CALayer的高度從0.5倍變?yōu)?.5倍6anim.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.5,0.5,1)];7anim.toValue? = [NSValue valueWithCATransform3D:CATransform3DMakeScale(2,1.5,1)];89[_myView.layer addAnimation:anim forKey:nil];
三、旋轉(zhuǎn)動畫
1CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];2anim.duration =1.5;34//繞著(0, 0, 1)這個向量軸順時針旋轉(zhuǎn)45°5anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_4,0,0,1)];67[_myView.layer addAnimation:anim forKey:nil];
其實可以不用設(shè)置fromValue,這里只設(shè)置了toValue
四、其他
* 除開前面使用的position、transform屬性,其實CALayer還有好多屬性都可以形成動畫,這些屬性統(tǒng)稱為"Animatable Properties"。在《CALayer3-層的屬性》開頭有介紹如何搜索這些屬性
*CABasicAnimation雖然能夠做很多基本的動畫效果,但是有個局限性,只能讓CALayer的屬性從某個值漸變到另一個值,僅僅是在2個值之間漸變