iOS动画之粒子效果
2015-07-20 01:42
666 查看
04.粒子动画
1.效果:
随机绘制一条路径,点击开始按钮,粒子动画2.实现思路
1.搞个画板绘制路径,自定义view2.给自定义view添加pan手势,和创建复制图层和圆形图层,只需要设置一次,在awakeFromNib方法中设置。
// 添加pan手势 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]; [self addGestureRecognizer:pan]; // 创建复制图层 CAReplicatorLayer *repLayer = [CAReplicatorLayer layer]; repLayer.frame = self.bounds; [self.layer addSublayer:repLayer]; // 创建粒子图层 CALayer *layer = [CALayer layer]; layer.cornerRadius = 5; layer.frame = CGRectMake(-100, 10, 10, 10); layer.backgroundColor = [UIColor whiteColor].CGColor; [repLayer addSublayer:layer]; _dotLayer = layer;
3.因为核心动画只能设置一个路径,因此只能创建一个路径,懒加载路径。
- (UIBezierPath *)path { if (_path == nil) { _path = [UIBezierPath bezierPath]; } return _path; }
4.在一开始拖动的时候,保存路径起点,设置路径起点,拖动的时候每次添加线到某个点。
CGPoint curP = [pan locationInView:self]; if (pan.state == UIGestureRecognizerStateBegan) { _startP = curP; [self.path moveToPoint:_startP]; } [self.path addLineToPoint:curP]; [self setNeedsDisplay];
5.路径绘制好了,点击开始按钮的时候,添加动画到图层
CAKeyframeAnimation *anim = [CAKeyframeAnimation animation]; anim.keyPath = @"position"; anim.duration = 4; anim.path = self.path.CGPath; anim.repeatCount = MAXFLOAT; [_dotLayer addAnimation:anim forKey:@"anim"]; anim.delegate = self;
6.复制图层
repLayer.instanceCount = 20; repLayer.instanceDelay = 4 / 20.0; // 设置子层颜色 repLayer.instanceColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:1].CGColor; // 设置子层颜色绿色通道偏移量 repLayer.instanceGreenOffset = -0.03;
7.重绘
清空路径,重新绘制,移除图层动画。
_path = nil; [_dotLayer removeAnimationForKey:@"anim"]; [self setNeedsDisplay];
3.全部代码
#import "DrawView.h" @interface DrawView () @property (nonatomic, strong) UIBezierPath *path; @property (nonatomic, assign) CGPoint startP; @property (nonatomic, strong) CALayer *dotLayer; @property (nonatomic, strong) CAReplicatorLayer *repLayer; @property (nonatomic, strong) CAKeyframeAnimation *anim; @end @implementation DrawView - (UIBezierPath *)path { if (_path == nil) { _path = [UIBezierPath bezierPath]; } return _path; } - (CAReplicatorLayer *)repLayer { if (_repLayer == nil) { _repLayer = [CAReplicatorLayer layer]; _repLayer.instanceCount = 20; _repLayer.instanceDelay = 4 / 20.0; _repLayer.frame = self.bounds; // 设置子层颜色 _repLayer.instanceColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:1].CGColor; // 设置子层颜色绿色通道偏移量 _repLayer.instanceGreenOffset = -0.03; } return _repLayer; } - (CALayer *)dotLayer { if (_dotLayer == nil) { // 创建粒子图层 _dotLayer = [CALayer layer]; _dotLayer.cornerRadius = 5; _dotLayer.frame = CGRectMake(-100, 10, 10, 10); _dotLayer.backgroundColor = [UIColor whiteColor].CGColor; } return _dotLayer; } - (CAKeyframeAnimation *)anim { if (_anim == nil) { _anim = [CAKeyframeAnimation animation]; _anim.keyPath = @"position"; _anim.duration = 4; _anim.repeatCount = MAXFLOAT; _anim.delegate = self; } return _anim; } - (void)awakeFromNib { // 添加pan手势 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]; [self addGestureRecognizer:pan]; // 创建复制图层 [self.layer addSublayer:self.repLayer]; [self.repLayer addSublayer:self.dotLayer];} - (void)reDraw { self.path = nil; [self.dotLayer removeAnimationForKey:@"anim"]; [self setNeedsDisplay]; } - (void)startAnim { self.anim.path = self.path.CGPath; [self.dotLayer addAnimation:self.anim forKey:@"anim"]; } - (void)pan:(UIPanGestureRecognizer *)pan { CGPoint curP = [pan locationInView:self]; if (pan.state == UIGestureRecognizerStateBegan) { _startP = curP; [self.path moveToPoint:_startP]; } [self.path addLineToPoint:curP]; [self setNeedsDisplay]; } // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { // Drawing code [self.path stroke]; } @end
4.Demo
https://github.com/Esdeath/ParticleEffects相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- Gifski:一个跨平台的高质量 GIF 编码器
- 模仿动画的放大缩小容器
- php判断GIF图片是否为动画的方法
- 浅析JavaScript动画
- js排序动画模拟-插入排序
- jQuery动画特效实例教程
- JQuery动画和停止动画实例代码
- JQuery动画与特效实例分析
- Jquery 自定义动画概述及示例
- 基于jquery的动画效果代码
- 锋利的jQuery 要点归纳(三) jQuery中的事件和动画(上:事件篇)
- 基于Jquery的温度计动画效果
- js判断客户端是iOS还是Android等移动终端的方法