CABasicAnimation animationWithKeyPath 一些规定的值
http://www.cnblogs.com/pengyingh/articles/2379631.html
CABasicAnimation *theAnimation; theAnimation=[CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; theAnimation.delegate = self; theAnimation.duration = 1; theAnimation.repeatCount = 0; theAnimation.removedOnCompletion = FALSE; theAnimation.fillMode = kCAFillModeForwards; theAnimation.autoreverses = NO; theAnimation.fromValue = [NSNumber numberWithFloat:0]; theAnimation.toValue = [NSNumber numberWithFloat:-60]; [self.view.layer addAnimation:theAnimation forKey:@"animateLayer"];
我们可以通过animationWithKeyPath键值对的方式来改变动画 animationWithKeyPath的值: transform.scale = 比例轉換 transform.scale.x = 闊的比例轉換 transform.scale.y = 高的比例轉換 transform.rotation.z = 平面圖的旋轉 opacity = 透明度 margin zPosition backgroundColor cornerRadius borderWidth bounds contents contentsRect cornerRadius frame hidden mask masksToBounds opacity position shadowColor shadowOffset shadowOpacity shadowRadius [self. ui_View.layer removeAllAnimations]; CABasicAnimation *pulse = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; pulse.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; pulse.duration = 0.5 + (rand() % 10) * 0.05; pulse.repeatCount = 1; pulse.autoreverses = YES; pulse.fromValue = [NSNumber numberWithFloat:.8]; pulse.toValue = [NSNumber numberWithFloat:1.2]; [self.ui_View.layer addAnimation:pulse forKey:nil]; // bounds CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"bounds"]; anim.duration = 1.f; anim.fromValue = [NSValue valueWithCGRect:CGRectMake(0,0,10,10)]; anim.toValue = [NSValue valueWithCGRect:CGRectMake(10,10,200,200)]; anim.byValue = [NSValue valueWithCGRect:self. ui_View.bounds]; // anim.toValue = (id)[UIColor redColor].CGColor; // anim.fromValue = (id)[UIColor blackColor].CGColor; anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; anim.repeatCount = 1; anim.autoreverses = YES; [ui_View.layer addAnimation:anim forKey:nil]; //cornerRadius CABasicAnimation *anim2 = [CABasicAnimation animationWithKeyPath:@"cornerRadius"]; anim2.duration = 1.f; anim2.fromValue = [NSNumber numberWithFloat:0.f]; anim2.toValue = [NSNumber numberWithFloat:20.f]; anim2.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; anim2.repeatCount = CGFLOAT_MAX; anim2.autoreverses = YES; [ui_View.layer addAnimation:anim2 forKey:@"cornerRadius"]; //contents CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"contents"]; anim.duration = 1.f; anim.fromValue = (id)[UIImage imageNamed:@"1.jpg"].CGImage; anim.toValue = (id)[UIImage imageNamed:@"2.png"].CGImage; // anim.byValue = (id)[UIImage imageNamed:@"3.png"].CGImage; // anim.toValue = (id)[UIColor redColor].CGColor; // anim.fromValue = (id)[UIColor blackColor].CGColor; anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; anim.repeatCount = CGFLOAT_MAX; anim.autoreverses = YES; [ui_View.layer addAnimation:anim forKey:nil]; [ui_View.layer setShadowOffset:CGSizeMake(2,2)]; [ui_View.layer setShadowOpacity:1]; [ui_View.layer setShadowColor:[UIColor grayColor].CGColor]; // CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"shadowColor"]; anim.duration = 1.f; anim.toValue = (id)[UIColor redColor].CGColor; anim.fromValue = (id)[UIColor blackColor].CGColor; anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; anim.repeatCount = CGFLOAT_MAX; anim.autoreverses = YES; [ui_View.layer addAnimation:anim forKey:nil]; CABasicAnimation *_anim = [CABasicAnimation animationWithKeyPath:@"shadowOffset"]; _anim.duration = 1.f; _anim.fromValue = [NSValue valueWithCGSize:CGSizeMake(0,0)]; _anim.toValue = [NSValue valueWithCGSize:CGSizeMake(3,3)]; _anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; _anim.repeatCount = CGFLOAT_MAX; _anim.autoreverses = YES; [ui_View.layer addAnimation:_anim forKey:nil]; CABasicAnimation *_anim1 = [CABasicAnimation animationWithKeyPath:@"shadowOpacity"]; _anim1.duration = 1.f; _anim1.fromValue = [NSNumber numberWithFloat:0.5]; _anim1.toValue = [NSNumber numberWithFloat:1]; _anim1.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; _anim1.repeatCount = CGFLOAT_MAX; _anim1.autoreverses = YES; [ui_View.layer addAnimation:_anim1 forKey:nil]; CABasicAnimation *_anim2 = [CABasicAnimation animationWithKeyPath:@"shadowRadius"]; _anim2.duration = 1.f; _anim2.fromValue = [NSNumber numberWithFloat:10]; _anim2.toValue = [NSNumber numberWithFloat:5]; _anim2.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; _anim2.repeatCount = CGFLOAT_MAX; _anim2.autoreverses = YES; [ui_View.layer addAnimation:_anim2 forKey:nil];
- (void)viewDidLoad { [super viewDidLoad]; layer=[CALayer layer]; layer.frame=CGRectMake(50, 200, 50, 50); layer.backgroundColor=[UIColor orangeColor].CGColor; layer.cornerRadius=8.0f; CABasicAnimation *animation=[CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; animation.duration=4.0f; animation.autoreverses=NO; animation.repeatCount=1; animation.toValue=[NSNumber numberWithInt:-10]; animation.fromValue=[NSNumber numberWithInt:200]; animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; CABasicAnimation *animationZoomIn=[CABasicAnimation animationWithKeyPath:@"transform.scale"]; animationZoomIn.duration=2.0f; animationZoomIn.autoreverses=NO; animationZoomIn.repeatCount=1; animationZoomIn.toValue=[NSNumber numberWithFloat:1.56]; animationZoomIn.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; CABasicAnimation *animationZoomOut=[CABasicAnimation animationWithKeyPath:@"transform.scale"]; animationZoomOut.beginTime=2.0f; animationZoomOut.duration=2.0f; animationZoomOut.autoreverses=NO; animationZoomOut.repeatCount=1; animationZoomOut.toValue=[NSNumber numberWithFloat:.01]; animationZoomOut.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; CAAnimationGroup *group=[CAAnimationGroup animation]; group.duration=4.0f; group.animations=[NSArray arrayWithObjects: animation, animationZoomIn, animationZoomOut,nil]; group.removedOnCompletion=NO; group.fillMode=kCAFillModeForwards; [layer addAnimation:group forKey:nil]; [self.view.layer addSublayer:layer]; //layer.hidden=YES; }
基于CABasicAnimation、CAAnimationGroup组合动画示例
http://www.cocoachina.com/bbs/simple/?t27152.html
在做动画时,我们希望将几种动画叠加起来同时播放,或者依次连续播放。
我们可以通过CABasicAnimation和CAAnimationGroup来实现。
下面我把实现的主要函数贴出来,程序工程也一并发布(更新:直接给视图的层添加所需的动画,不需要另创建一个层对象):
#define ANIM_ROTATE @"animationRotate" #define ANIM_FALLING @"animationFalling" #define ANIM_GROUP @"animationFallingRotate" - (void)viewDidLoad { [super viewDidLoad]; UIImage* image = [UIImage imageNamed:@"image.png"]; m_pMyImageView = [[UIImageView alloc] initWithImage:image]; m_pMyImageView.center = CGPointMake(384, 50); [self.view addSubview:m_pMyImageView]; //在层上做旋转动画 CAAnimation* myAnimationRotate = [self animationRotate];; CAAnimation* myAnimationFallingDown = [self animationFallingDown];; CAAnimation* myAnimationShrink = [self animationShrink]; #if 0//method1:依次把各个动画加入层中 [m_pMyImageView.layer addAnimation:myAnimationRotateForever forKey:ANIM_ROTATE]; [m_pMyImageView.layer addAnimation:myAnimationFallingDown forKey:ANIM_FALLING]; #else//work well //method2:放入动画数组,统一处理! m_pGroupAnimation = [CAAnimationGroup animation]; //设置动画代理 m_pGroupAnimation.delegate = self; m_pGroupAnimation.removedOnCompletion = NO; m_pGroupAnimation.duration = 2.0; m_pGroupAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; m_pGroupAnimation.repeatCount = 1;//FLT_MAX; //"forever"; m_pGroupAnimation.fillMode = kCAFillModeForwards; m_pGroupAnimation.animations = [NSArray arrayWithObjects:myAnimationRotate, myAnimationFallingDown, myAnimationShrink, nil]; //对视图自身的层添加组动画 [m_pMyImageView.layer addAnimation:m_pGroupAnimation forKey:ANIM_GROUP]; #endif } |
/* * 1、make rotate */ - (CAAnimation *)animationRotate { // rotate animation CATransform3D rotationTransform = CATransform3DMakeRotation(M_PI, 1.0, 0, 0.0); CABasicAnimation* animation; animation = [CABasicAnimation animationWithKeyPath:@"transform"]; animation.toValue = [NSValue valueWithCATransform3D:rotationTransform]; animation.duration = 0.5; animation.autoreverses = NO; animation.cumulative = YES; animation.repeatCount = FLT_MAX; //"forever" //设置开始时间,能够连续播放多组动画 animation.beginTime = 0.5; //设置动画代理 animation.delegate = self; return animation; } /* * 2、fall down */ - (CAAnimation *)animationFallingDown { //falling down animation: CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; animation.duration = 2.0; animation.autoreverses = NO; animation.removedOnCompletion = NO; animation.repeatCount = FLT_MAX; //"forever" animation.fromValue = [NSNumber numberWithInt: 0]; animation.toValue = [NSNumber numberWithInt: 1024]; //设置动画代理 animation.delegate = self; return animation; } /* * 3、shrink animation */ - (CAAnimation *)animationShrink { CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; animation.toValue = [NSNumber numberWithDouble:2.0]; animation.duration = 2.0; animation.autoreverses = YES; animation.repeatCount = FLT_MAX; //"forever" animation.removedOnCompletion = NO; //设置动画代理 animation.delegate = self; return animation; } |
/* *动画结束后的委托函数,移除动画视图 */ - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { //这边为什么是nil? NSLog(@"anim = %@", [m_pMyImageView.layer valueForKey:ANIM_GROUP]); #if 1 //识别动画 //?debug发现两者的地址不一样,这个问题很纠结 if ([anim isEqual:m_pGroupAnimation])//[m_pMyImageView.layer valueForKey:ANIM_GROUP]) { NSLog(@"removeFromSuperview..."); [m_pMyImageView removeFromSuperview]; [m_pMyImageView release]; } #else //这种方法,虽然能解决方法,但是处理多个CAAnimationGroup动画或者CAAnimation动画时,就不能有效处理,方法待定 //这组动画结束,移除视图 if ([anim isKindOfClass:[CAAnimationGroup class]]) { //这边为什么是nil? NSLog(@"anim = %@", [m_pMyImageView.layer valueForKey:ANIM_GROUP]); [m_pMyImageView removeFromSuperview]; [m_pMyImageView release]; } #endif } |
update at 2010-10-25:
只是把初始化修改一下,代码思路更直观点,但是关于在动画结束代理中,识别层指定的动画方法仍不起作用,看了有关帖子,不过仍无果,请教大家?
补充一个缩放的动画函数,上面的demo我也重新更新一下!
/* *shrink animation */ - (CAAnimation *)animationShrink { CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; animation.toValue = [NSNumber numberWithDouble:2.0]; animation.duration = 2.0; animation.autoreverses = YES; animation.repeatCount = FLT_MAX; //"forever" animation.removedOnCompletion = NO; //设置动画代理 animation.delegate = self; return animation; } |