#pragma mark------iOS动画
- (void)initAnimation{
/*-----------组动画CAAnimationGroup--------*/
/*
CAAnimation的子类,可以保存一组动画对象,将CAAnimationGroup对象加入层后,组中所有动画对象可以同时并发运行。
重要属性
animations: 用来保存一组动画对象的NSArray
*/
// UIView* animationView = [[UIView alloc]init];
// [self.view addSubview:animationView];
// animationView.backgroundColor = [UIColor yellowColor];
// animationView.frame = CGRectMake(screenWidth/2-25, screenHeight/2-25, 50, 50);
//
// CAKeyframeAnimation* keyFrameAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
// NSValue* value1 = [NSValue valueWithCGPoint:CGPointMake(0, screenHeight/2-50)];
// NSValue* value2 = [NSValue valueWithCGPoint:CGPointMake(screenWidth/3, screenHeight/2-50)];
// NSValue* value3 = [NSValue valueWithCGPoint:CGPointMake(screenWidth/3, screenHeight/2+50)];
// NSValue* value4 = [NSValue valueWithCGPoint:CGPointMake(screenWidth/3*2, screenHeight/2+50)];
// NSValue* value5 = [NSValue valueWithCGPoint:CGPointMake(screenWidth/3*2, screenHeight/2-50)];
// NSValue* value6 = [NSValue valueWithCGPoint:CGPointMake(screenWidth, screenHeight/2-50)];
// keyFrameAnimation.values = [NSArray arrayWithObjects:value1,value2,value3,value4,value5,value6, nil];
//
// //缩放动画
// CABasicAnimation* basicAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
// basicAnimation.fromValue = [NSNumber numberWithFloat:0.1f];
// basicAnimation.toValue = [NSNumber numberWithFloat:2.0f];
//
// //旋转动画
// CABasicAnimation* rotAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
// rotAnimation.toValue = [NSNumber numberWithFloat:4*M_PI];
//
// //组动画
// CAAnimationGroup* groupAnimation = [CAAnimationGroup animation];
// groupAnimation.animations = [NSArray arrayWithObjects:keyFrameAnimation,basicAnimation,rotAnimation, nil];
// groupAnimation.duration = 8.0f;
// [animationView.layer addAnimation:groupAnimation forKey:@"groupAnimation"];
/*----------------------过渡动画CATransition------------------------------------------------*/
/*CATransition的子类,用于做过渡动画或者转场动画,能够为层提供移出屏幕和移入屏幕的动画效果
重要属性:type:动画过渡类型
Apple官方的SDK其实只提供了四种过渡效果
kCATransitionFade 渐变效果
kCATransitionMoveIn 进入覆盖效果
kCATransitionPush 推出效果
kCATransitionReveal 揭露离开效果
subtype:动画过渡方向
kCATransitionFromRight 从右侧进入
kCATransitionFromLeft 从左侧进入
kCATransitionFromTop 从顶部进入
kCATransitionFromBottom 从底部进入
startProgress:动画起点(在整体动画的百分比)
endProgress:动画终点(在整体动画的百分比)
*/
/*烟花效果🎆 使用的是一种比较特殊的动画---粒子动画*/
/*
一个粒子系统一般有两部分组成
1.CAEmitterCell:可以看作是单个粒子的原型,如:一个单一的粉扑在一团烟雾。当散发出一个粒子,UIKit根据这个发射粒子和定义的基础上创建一个随机粒子。此原型包括一些属性来控制粒子的图片,颜色、方向、运动,缩放比例和生命周期
2.CAEmitterLayer:主要控制发射源的位置、尺寸、发射模式、发射源的形状等等。他是一个高性能的粒子引擎,被用来创建复杂的粒子动画如:烟雾、火、雨等效果,并且很好的控制了性能
CAEmitterLayer就像大炮,决定了(1)哪里发射(2)大炮有多大
CAEmitterCell就像是炮弹,觉得了(1)初速度(2)加速度(3)炮弹类型(4)发射后的角度 等等
首先提醒CAEmitterLayer本身没有什么难度,主要在于两点:
属性较多(一会会把属性都列举出来,不知道了随时查阅就是)
调参数比较费时(想要有好的动画效果还得慢慢的去调整各项参数,不过没有难度就是有点费时间)
平常用的多的比如 emitterShape 的 kCAEmitterLayerLine 和 kCAEmitterLayerPoint。这两个从视觉上还是比较好区分的,这决定了你的粒子是从一个点「喷」出来的,还是从一条线上每个点「喷」下来,前者像焰火,后者像瀑布。显然,下雪的效果更像后者。
emitterMode 的 kCAEmitterLayerOutline 表示向外围扩散,如果你的发射源形状是 circle,那么 kCAEmitterLayerOutline 就会以一个圆的方式向外扩散开。
又比如你想表达一股蒸汽向上喷的效果,就可以设置 emitterShape 为 kCAEmitterLayerLine , emitterMode 为 kCAEmitterLayerOutline。
CAEmitterCell(炮弹)的属性
其实CAEmitterCell真是的名字叫粒子
3.
*/
/*总结--任何复杂的动画都是有一个个简单的动画组装的,只要我们善于分解和组装,就能实现满意的效果*/
/*一些常用的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之间的
*/
/*---------背景颜色--------透明度-----------*/
// UIView* animationView = [[UIView alloc]init];
// [self.view addSubview:animationView];
// animationView.backgroundColor = [UIColor blueColor];
// animationView.frame = CGRectMake(screenWidth/2-25, screenHeight/2-25, 50, 50);
//
// CABasicAnimation* backgroudColor = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];//背景色
// backgroudColor.fromValue = (id)[UIColor redColor].CGColor;
// backgroudColor.toValue = (id)[UIColor yellowColor].CGColor;
//
// CABasicAnimation* viewAplha = [CABasicAnimation animationWithKeyPath:@"opacity"];//透明度
// viewAplha.fromValue = @(0.1);
// viewAplha.toValue = @(0.7);
//
// //组动画
// CAAnimationGroup* groupAnimation = [CAAnimationGroup animation];
// groupAnimation.animations = [NSArray arrayWithObjects:backgroudColor,viewAplha, nil];
// groupAnimation.duration = 8.0f;
// [animationView.layer addAnimation:groupAnimation forKey:@"groupAnimation"];
//
/*-----------------------------粒子动画-----------------------------------------------*/
CAEmitterLayer* snowEmitter = [CAEmitterLayer layer];//创建一个CAEmitterLayer--也就是大炮
snowEmitter.emitterPosition = CGPointMake(80, 180);//指定发射源的位置
snowEmitter.masksToBounds = NO;//不修改边界
// snowEmitter.emitterSize = CGSizeMake(snowEmitter.frame.size.width/2.0, snowEmitter.frame.size.height/2.0);//指定发射源的大小
snowEmitter.emitterSize = CGSizeMake(screenWidth, screenHeight/2.0);//指定发射源的大小(也就是炮弹出现的区域)
snowEmitter.emitterShape = kCAEmitterLayerRectangle;//发射源的形状kCAEmitterLayerLine//kCAEmitterLayerCircle
snowEmitter.emitterMode = kCAEmitterLayerOutline;//发射源的模式
snowEmitter.contents =(id)[UIImage imageNamed:@"icon_payment@2x"].CGImage;
CAEmitterCell* snowFlake = [CAEmitterCell emitterCell];//创建CAEmitterCell
snowFlake.birthRate = 10.0;//每秒多少个
snowFlake.lifetime = 50.0;//存活时间
snowFlake.velocity = 10;//因为动画属于落体效果,所以我们只需要设置他在y方向上的加速度就行了。
snowFlake.velocityRange = 8;//初速度范围
snowFlake.yAcceleration = 20;//y方向的加速度
snowFlake.xAcceleration = 20;
snowFlake.alphaSpeed = -0.4;
snowFlake.emissionRange = 8*M_PI;//以锥形分布开的发射角度。角度用弧度制。粒子均匀分布在这个锥形范围内。
snowFlake.contents = (id)[UIImage imageNamed:@"icon_payment@2x"].CGImage;//cell的内容。通常是一个指针CGImageRef。
// snowFlake.contents = (id)[UIColor redColor].CGColor;
snowFlake.scale = 0.5;//缩小
snowFlake.emissionLatitude = M_PI_2;//发射角度
snowFlake.color = [UIColor redColor].CGColor;
snowEmitter.emitterCells = [NSArray arrayWithObject:snowFlake];
[self.view.layer addSublayer:snowEmitter];//把粒子动画所添加的视图
}