#pragma mark------iOS動畫
- (void)initAnimation{
/*-----------組動畫CAAnimationGroup--------*/
/*
CAAnimation的子類铆遭,可以保存一組動畫對象竹祷,將CAAnimationGroup對象加入層后藏杖,組中所有動畫對象可以同時并發(fā)運行。
重要屬性
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];
//
//? ? //旋轉(zhuǎn)動畫
//? ? 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的子類,用于做過渡動畫或者轉(zhuǎn)場動畫团滥,能夠為層提供移出屏幕和移入屏幕的動畫效果
重要屬性:type:動畫過渡類型
Apple官方的SDK其實只提供了四種過渡效果
kCATransitionFade 漸變效果
kCATransitionMoveIn 進入覆蓋效果
kCATransitionPush 推出效果
kCATransitionReveal 揭露離開效果
subtype:動畫過渡方向
kCATransitionFromRight 從右側(cè)進入
kCATransitionFromLeft 從左側(cè)進入
kCATransitionFromTop 從頂部進入
kCATransitionFromBottom 從底部進入
startProgress:動畫起點(在整體動畫的百分比)
endProgress:動畫終點(在整體動畫的百分比)
*/
/*煙花效果??? 使用的是一種比較特殊的動畫---粒子動畫*/
/*
一個粒子系統(tǒng)一般有兩部分組成
1.CAEmitterCell:可以看作是單個粒子的原型颓影,如:一個單一的粉撲在一團煙霧。當散發(fā)出一個粒子盾鳞,UIKit根據(jù)這個發(fā)射粒子和定義的基礎(chǔ)上創(chuàng)建一個隨機粒子犬性。此原型包括一些屬性來控制粒子的圖片,顏色腾仅、方向仔夺、運動,縮放比例和生命周期
2.CAEmitterLayer:主要控制發(fā)射源的位置攒砖、尺寸、發(fā)射模式日裙、發(fā)射源的形狀等等吹艇。他是一個高性能的粒子引擎,被用來創(chuàng)建復雜的粒子動畫如:煙霧昂拂、火受神、雨等效果,并且很好的控制了性能
CAEmitterLayer就像大炮格侯,決定了(1)哪里發(fā)射(2)大炮有多大
CAEmitterCell就像是炮彈鼻听,覺得了(1)初速度(2)加速度(3)炮彈類型(4)發(fā)射后的角度 等等
首先提醒CAEmitterLayer本身沒有什么難度,主要在于兩點:
屬性較多(一會會把屬性都列舉出來联四,不知道了隨時查閱就是)
調(diào)參數(shù)比較費時(想要有好的動畫效果還得慢慢的去調(diào)整各項參數(shù)撑碴,不過沒有難度就是有點費時間)
平常用的多的比如 emitterShape 的 kCAEmitterLayerLine 和 kCAEmitterLayerPoint。這兩個從視覺上還是比較好區(qū)分的朝墩,這決定了你的粒子是從一個點「噴」出來的醉拓,還是從一條線上每個點「噴」下來,前者像焰火收苏,后者像瀑布亿卤。顯然,下雪的效果更像后者鹿霸。
emitterMode 的 kCAEmitterLayerOutline 表示向外圍擴散排吴,如果你的發(fā)射源形狀是 circle,那么 kCAEmitterLayerOutline 就會以一個圓的方式向外擴散開懦鼠。
又比如你想表達一股蒸汽向上噴的效果钻哩,就可以設置 emitterShape 為 kCAEmitterLayerLine , emitterMode 為 kCAEmitterLayerOutline葛闷。
CAEmitterCell(炮彈)的屬性
其實CAEmitterCell真是的名字叫粒子
3.
*/
/*總結(jié)--任何復雜的動畫都是有一個個簡單的動畫組裝的憋槐,只要我們善于分解和組裝,就能實現(xiàn)滿意的效果*/
/*一些常用的animationWithKeyPath值的總結(jié)
值 說明 使用形式
transform.scale 比例轉(zhuǎn)化 @(0.8)
transform.scale.x 寬的比例 @(0.8)
transform.scale.y 高的比例 @(0.8)
transform.rotation.x 圍繞x軸旋轉(zhuǎn) @(M_PI)
transform.rotation.y 圍繞y軸旋轉(zhuǎn) @(M_PI)
transform.rotation.z 圍繞z軸旋轉(zhuǎn) @(M_PI)
cornerRadius 圓角的設置 @(50)
backgroundColor 背景顏色的變化 (id)[UIColor purpleColor].CGColor
bounds 大小淑趾,中心不變 [NSValue valueWithCGRect:CGRectMake(0, 0, 200, 200)];
position 位置(中心點的改變) [NSValue valueWithCGPoint:CGPointMake(300, 300)];
contents 內(nèi)容阳仔,比如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];//創(chuàng)建一個CAEmitterLayer--也就是大炮
snowEmitter.emitterPosition = CGPointMake(80, 180);//指定發(fā)射源的位置
snowEmitter.masksToBounds = NO;//不修改邊界
//? ? snowEmitter.emitterSize = CGSizeMake(snowEmitter.frame.size.width/2.0, snowEmitter.frame.size.height/2.0);//指定發(fā)射源的大小
snowEmitter.emitterSize = CGSizeMake(screenWidth, screenHeight/2.0);//指定發(fā)射源的大小(也就是炮彈出現(xiàn)的區(qū)域)
snowEmitter.emitterShape = kCAEmitterLayerRectangle;//發(fā)射源的形狀kCAEmitterLayerLine//kCAEmitterLayerCircle
snowEmitter.emitterMode = kCAEmitterLayerOutline;//發(fā)射源的模式
snowEmitter.contents =(id)[UIImage imageNamed:@"icon_payment@2x"].CGImage;
CAEmitterCell* snowFlake = [CAEmitterCell emitterCell];//創(chuàng)建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;//以錐形分布開的發(fā)射角度嘶摊。角度用弧度制。粒子均勻分布在這個錐形范圍內(nèi)评矩。
snowFlake.contents = (id)[UIImage imageNamed:@"icon_payment@2x"].CGImage;//cell的內(nèi)容叶堆。通常是一個指針CGImageRef。
//? ? snowFlake.contents = (id)[UIColor redColor].CGColor;
snowFlake.scale = 0.5;//縮小
snowFlake.emissionLatitude = M_PI_2;//發(fā)射角度
snowFlake.color = [UIColor redColor].CGColor;
snowEmitter.emitterCells = [NSArray arrayWithObject:snowFlake];
[self.view.layer addSublayer:snowEmitter];//把粒子動畫所添加的視圖
}