第二十九篇、CoreAnimation的使用
使用的的三个步骤
1.初始化演员
2.设置好剧情
3.播放
主要类:
CALayer // 绘图部分
CABaseAnimation // 基本动画(缩放,移动)
CAKeyframeAnimation // 关键帧动画(设置动画执行的路径,常借助贝塞尔曲线)
CAAnimationGroup // 动画组(将动画添加到组,并设置Delegate监听动画结束)
常见的keypath
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
附录:一个把商品添加到购物车的抛物线动画
coreAnimation // 1.初始化演员
CALayer *layer = [[CALayer alloc]init];
layer.bounds = CGRectMake(, , [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height);
layer.position = CGPointMake(, );
// 设置内容
//layer.contents = (id)_imageViewBtn.imageView.image.CGImage
[self.view.layer addSublayer:layer]; // 2.设定剧情
// 贝尔曲线
UIBezierPath *movePath = [UIBezierPath bezierPath];
[movePath moveToPoint:layer.position];
[movePath addQuadCurveToPoint:CGPointMake(, [UIScreen mainScreen].bounds.size.height - - )
controlPoint:CGPointMake(,)]; // 关键帧
CAKeyframeAnimation *positionnAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
positionnAnimation.path = movePath.CGPath;
positionnAnimation.removedOnCompletion = YES; // 基本动画(缩放)
CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.sale"];
scaleAnimation.fromValue = @;
scaleAnimation.toValue = @.;
scaleAnimation.duration = .8f;
scaleAnimation.autoreverses = NO;
scaleAnimation.repeatCount = ;
// 防止动画闪烁
scaleAnimation.removedOnCompletion = NO;
scaleAnimation.fillMode = kCAFillModeForwards; scaleAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; // 组动画
CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
animationGroup.duration = 0.8f;
animationGroup.autoreverses = NO;
animationGroup.repeatCount = ;
animationGroup.repeatDuration = NO;
animationGroup.fillMode = kCAFillModeForwards;
[animationGroup setAnimations:[NSArray arrayWithObjects:positionnAnimation,scaleAnimation, nil]]; // 3.播放
[layer addAnimation:animationGroup forKey:nil];
第二种实现方式:
#import "ViewController.h"
#define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)
#define SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height) @interface ViewController ()
@property (nonatomic,strong) UIBezierPath *path;
@end @implementation ViewController{
CALayer *layer;
UILabel *_cntLabel;
NSInteger _cnt;
UIImageView *_imageView;
UIButton *_btn;
} - (void)viewDidLoad {
[super viewDidLoad];
_cnt = ;
[self setUI]; }
-(void)setUI
{
UIColor *customColor = [UIColor colorWithRed:/255.0 green:/255.0 blue:/255.0 alpha:1.0f];
//
_btn = [UIButton buttonWithType:UIButtonTypeCustom];
_btn.frame = CGRectMake(, SCREEN_HEIGHT * 0.7, , );
[_btn setTitle:@"立即抢购" forState:UIControlStateNormal];
[_btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
_btn.titleLabel.font = [UIFont boldSystemFontOfSize:];
[_btn setBackgroundImage:[UIImage imageNamed:@"ButtonRedLarge"] forState:UIControlStateNormal];
[_btn addTarget:self action:@selector(startAnimation) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:_btn];
_imageView = [[UIImageView alloc] initWithFrame:CGRectMake(, , , )];
_imageView.image = [UIImage imageNamed:@"TabCartSelected@2x.png"];
_imageView.center = CGPointMake(, );
[self.view addSubview:_imageView];
// label
_cntLabel = [[UILabel alloc] initWithFrame:CGRectMake(, , , )];
_cntLabel.textColor = customColor;
_cntLabel.textAlignment = NSTextAlignmentCenter;
_cntLabel.font = [UIFont boldSystemFontOfSize:];
_cntLabel.backgroundColor = [UIColor whiteColor];
_cntLabel.layer.cornerRadius = CGRectGetHeight(_cntLabel.bounds)/;
_cntLabel.layer.masksToBounds = YES;
_cntLabel.layer.borderWidth = 1.0f;
_cntLabel.layer.borderColor = customColor.CGColor;
[self.view addSubview:_cntLabel];
if (_cnt == ) {
_cntLabel.hidden = YES;
} self.path = [UIBezierPath bezierPath];
[_path moveToPoint:CGPointMake(, )];
[_path addQuadCurveToPoint:CGPointMake(, ) controlPoint:CGPointMake(, )];
}
-(void)startAnimation
{
if (!layer) {
_btn.enabled = NO;
layer = [CALayer layer];
layer.contents = (__bridge id)[UIImage imageNamed:@"test01.jpg"].CGImage;
layer.contentsGravity = kCAGravityResizeAspectFill;
layer.bounds = CGRectMake(, , , );
[layer setCornerRadius:CGRectGetHeight([layer bounds]) / ];
layer.masksToBounds = YES;
layer.position =CGPointMake(, );
[self.view.layer addSublayer:layer];
}
[self groupAnimation];
}
-(void)groupAnimation
{
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
animation.path = _path.CGPath;
animation.rotationMode = kCAAnimationRotateAuto; CABasicAnimation *expandAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
expandAnimation.duration = 0.5f;
expandAnimation.fromValue = [NSNumber numberWithFloat:];
expandAnimation.toValue = [NSNumber numberWithFloat:2.0f];
expandAnimation.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; CABasicAnimation *narrowAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
narrowAnimation.beginTime = 0.5;
narrowAnimation.fromValue = [NSNumber numberWithFloat:2.0f];
narrowAnimation.duration = 1.5f;
narrowAnimation.toValue = [NSNumber numberWithFloat:0.5f]; narrowAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; CAAnimationGroup *groups = [CAAnimationGroup animation];
groups.animations = @[animation,expandAnimation,narrowAnimation];
groups.duration = 2.0f;
groups.removedOnCompletion=NO;
groups.fillMode=kCAFillModeForwards;
groups.delegate = self;
[layer addAnimation:groups forKey:@"group"];
} -(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
// [anim def];
if (anim == [layer animationForKey:@"group"]) {
_btn.enabled = YES;
[layer removeFromSuperlayer];
layer = nil;
_cnt++;
if (_cnt) {
_cntLabel.hidden = NO;
} // 数量渐变
CATransition *animation = [CATransition animation];
animation.duration = 3.25f;
_cntLabel.text = [NSString stringWithFormat:@"%ld",(long)_cnt];
[_cntLabel.layer addAnimation:animation forKey:nil]; // 购物车上下跳动
CABasicAnimation *shakeAnimation = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"];
shakeAnimation.duration = 0.25f;
shakeAnimation.fromValue = [NSNumber numberWithFloat:-];
shakeAnimation.toValue = [NSNumber numberWithFloat:];
shakeAnimation.autoreverses = YES;
[_imageView.layer addAnimation:shakeAnimation forKey:nil];
}
}
第二十九篇、CoreAnimation的使用的更多相关文章
- 第二十九篇、UICollectionView瀑布流
1.实现思路 >第一种方案:UIScrollView 镶嵌三个UITableView (不推荐使用) >第二种方案:UIScrollView 镶嵌UIImageView (需要解决循环利用 ...
- Python之路(第二十九篇) 面向对象进阶:内置方法补充、异常处理
一.__new__方法 __init__()是初始化方法,__new__()方法是构造方法,创建一个新的对象 实例化对象的时候,调用__init__()初始化之前,先调用了__new__()方法 __ ...
- 第二十九篇:使用SOUI的SMCListView控件
列表控件是客户端应用最常用的控件之一.列表控件通常只负责显示数据,最多通知一下APP列表行的选中状态变化. 现在的UI经常要求程序猿在列表控件里不光显示内容,还要能和用户交互,显示动画等等,传统的列表 ...
- 第二十九篇-Fragment动态用法
效果图: 上节学习了静态添加Fragment的方法,这节学习动态添加方法. 主页面 layout.xml Fragment页面 layout2.xml 实现功能,当点击主页面的button时,将Fra ...
- flask第二十九篇——一个例子+【更新内容通知】
请关注公众号:自动化测试实战 大家先自己写一下,船长写这个花了半个小时,因为我和大家一样,也是新手: 写一个页面如下,点击书名以后跳转到书的详情页 书的信息如下: books = [ { 'id': ...
- Android UI开发第二十九篇——Android中五种常用的menu(菜单)
Android Menu在手机的应用中起着导航的作用,作者总结了5种常用的Menu. 1.左右推出的Menu 前段时间比较流行,我最早是在海豚浏览器中看到的,当时耳目一新.最早使用左右推出菜单的,听说 ...
- Python之路【第二十九篇】:django ORM模型层
ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的 ...
- 第二十九篇 玩转数据结构——线段树(Segment Tree)
1.. 线段树引入 线段树也称为区间树 为什么要使用线段树:对于某些问题,我们只关心区间(线段) 经典的线段树问题:区间染色,有一面长度为n的墙,每次选择一段墙进行染色(染色允许覆盖),问 ...
- 第二十九篇 -- PY程序返回值问题
今天兴之所至,来写一写关于程序返回值的问题.普通的py程序就不用多说了,sys.exit(result),result就是你想返回的返回值啦.我们今天来讲讲用PyQt5写的带界面的程序如何设置返回值的 ...
随机推荐
- OAuth 2.0
国外 OAuth2.0 大全:http://oauth.net/2/ 国内经典:http://www.fising.cn/2011/03/%E4%B8%80%E6%AD%A5%E4%B8%80%E6% ...
- 解决 DCEF3 在 BeforePopup 事件中打开新窗体的问题
此问题的解决方案从 https://groups.google.com/forum/#!topic/delphichromiumembedded/xzshOr-pjnU 获得. procedure T ...
- POJ - 2965 - The Pilots Brothers' refrigerator (高效贪心!!)
The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19356 ...
- [Ext JS 4] 实战之 带week(星期)的日期选择控件(三)
前言 在 [Ext JS 4] 实战之 带week(星期)的日期选择控件(二) 的最后,有提到一个解决方案. 不过这方案有一个条件 ==> “2. 每年的周数从(1-52), 如果超过52 周 ...
- [ES6] 19. for ... of
In ES5, we have for ... in: var phones = ["iPhone", "Nexus", "Nokia"]; ...
- android 多语言版本开发
最近项目中用用到语言切换功能,第一想到的就是资源文件,没错. 在资源文件中新建一个文件夹values-en,en表示英语,有一些还细化到地区,如values-en-rUS 即美国地区的英语,r是必需的 ...
- 文献阅读笔记——group sparsity and geometry constrained dictionary
周五实验室有同学报告了ICCV2013的一篇论文group sparsity and geometry constrained dictionary learning for action recog ...
- adobe air 通用设置
某些应用程序描述符设置对所有移动设备应用程序都很重要. 所需的 AIR 运行时版本 使用应用程序描述符文件的命名空间指定应用程序所需的 AIR 运行时版本. 在 application 元素中分配的命 ...
- MySQL并发复制系列三:MySQL和MariaDB实现对比
http://blog.itpub.net/28218939/viewspace-1975856/ 并发复制(Parallel Replication) 系列三:MySQL 5.7 和MariaDB ...
- 申请TexturePacker 或 PhysicsEditor free licenses
有一个跟开发有关的blog,就可以去 http://www.codeandweb.com/request-free-license 申请一个free licenses. 可以申请TexturePack ...