CAShapeLayer的path动画
CAShapeLayer的path动画
效果
源码
https://github.com/YouXianMing/Animations
- //
- // CAShapeLayerPathController.m
- // Animations
- //
- // Created by YouXianMing on 15/11/17.
- // Copyright © 2015年 YouXianMing. All rights reserved.
- //
- #import "CAShapeLayerPathController.h"
- #import "PathView.h"
- #import "UIView+SetRect.h"
- #import "GCD.h"
- @interface CAShapeLayerPathController ()
- @property (nonatomic, strong) PathView *pathView;
- @property (nonatomic, strong) GCDTimer *timer;
- @property (nonatomic, strong) CAShapeLayer *lineShapeLayer;
- @property (nonatomic, strong) CAShapeLayer *fillShapeLayer;
- @property (nonatomic) CGPoint A;
- @property (nonatomic, strong) CALayer *pointA;
- @end
- @implementation CAShapeLayerPathController
- - (void)viewDidLoad {
- [super viewDidLoad];
- }
- - (void)setup {
- [super setup];
- // background view
- self.pathView = [[PathView alloc] initWithFrame:CGRectMake(, , , )];
- self.pathView.center = self.view.center;
- self.pathView.gap = .f;
- [self.pathView setNeedsDisplay];
- [self.view addSubview:self.pathView];
- UIBezierPath *path = [self randomPath];
- // point A
- self.pointA = [CALayer layer];
- self.pointA.frame = CGRectMake(, , , );
- self.pointA.cornerRadius = .f;
- self.pointA.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5f].CGColor;
- self.pointA.position = CGPointMake(self.A.x + , self.A.y + );
- [self.pathView.layer addSublayer:self.pointA];
- // shape
- self.fillShapeLayer = [CAShapeLayer layer];
- self.fillShapeLayer.path = path.CGPath;
- self.fillShapeLayer.strokeColor = [UIColor clearColor].CGColor;
- self.fillShapeLayer.fillColor = [UIColor cyanColor].CGColor;
- self.fillShapeLayer.lineWidth = .f;
- self.fillShapeLayer.frame = CGRectMake(self.pathView.gap,
- self.pathView.gap,
- self.pathView.width - * self.pathView.gap,
- self.pathView.width - * self.pathView.gap);
- [self.pathView.layer addSublayer:self.fillShapeLayer];
- // line
- self.lineShapeLayer = [CAShapeLayer layer];
- self.lineShapeLayer.path = path.CGPath;
- self.lineShapeLayer.strokeColor = [UIColor redColor].CGColor;
- self.lineShapeLayer.fillColor = [UIColor clearColor].CGColor;
- self.lineShapeLayer.lineWidth = 0.5f;
- self.lineShapeLayer.lineDashPattern = @[@(), @()];
- self.lineShapeLayer.frame = CGRectMake(self.pathView.gap,
- self.pathView.gap,
- self.pathView.width - * self.pathView.gap,
- self.pathView.width - * self.pathView.gap);
- [self.pathView.layer addSublayer:self.lineShapeLayer];
- // timer
- self.timer = [[GCDTimer alloc] initInQueue:[GCDQueue mainQueue]];
- [self.timer event:^{
- // path animation.
- UIBezierPath *newPath = [self randomPath];
- CABasicAnimation *basicAnimation = [CABasicAnimation animationWithKeyPath:@"path"];
- basicAnimation.duration = 0.5;
- basicAnimation.fromValue = (__bridge id)(self.lineShapeLayer.path);
- basicAnimation.toValue = (__bridge id)newPath.CGPath;
- self.lineShapeLayer.path = newPath.CGPath;
- self.fillShapeLayer.path = newPath.CGPath;
- [self.lineShapeLayer addAnimation:basicAnimation forKey:@"lineShapeLayerPath"];
- [self.fillShapeLayer addAnimation:basicAnimation forKey:@"fillShapeLayerPath"];
- // fillColor animation.
- UIColor *newColor = [self randomColor];
- CABasicAnimation *colorAnimation = [CABasicAnimation animationWithKeyPath:@"fillColor"];
- colorAnimation.duration = 0.5;
- colorAnimation.fromValue = (__bridge id _Nullable)(self.fillShapeLayer.fillColor);
- colorAnimation.toValue = (__bridge id)newColor.CGColor;
- self.fillShapeLayer.fillColor = newColor.CGColor;
- [self.fillShapeLayer addAnimation:colorAnimation forKey:@"fillShapeLayerColor"];
- // path animation.
- CGPoint newPoint = CGPointMake(self.A.x + , self.A.y + );
- CABasicAnimation *positionAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
- positionAnimation.duration = 0.5f;
- positionAnimation.fromValue = [NSValue valueWithCGPoint:self.pointA.position];
- positionAnimation.toValue = [NSValue valueWithCGPoint:newPoint];
- self.pointA.position = newPoint;
- [self.pointA addAnimation:positionAnimation forKey:@"positionAnimation"];
- } timeIntervalWithSecs:.f];
- [self.timer start];
- }
- - (UIBezierPath *)randomPath {
- CGPoint pointA = [self randomPointA];
- CGPoint pointB = [self randomPointB];
- CGPoint pointC = [self randomPointC];
- CGPoint pointD = [self randomPointD];
- self.A = pointA;
- UIBezierPath* bezierPath = [UIBezierPath bezierPath];
- [bezierPath moveToPoint:pointA];
- [bezierPath addLineToPoint:pointB];
- [bezierPath addLineToPoint:pointC];
- [bezierPath addLineToPoint:pointD];
- [bezierPath closePath];
- return bezierPath;
- }
- - (CGPoint)randomPointA {
- return CGPointMake(arc4random() % (int)(self.pathView.width - * self.pathView.gap), );
- }
- - (CGPoint)randomPointB {
- return CGPointMake(self.pathView.width - * self.pathView.gap, arc4random() % (int)(self.pathView.width - * self.pathView.gap));
- }
- - (CGPoint)randomPointC {
- return CGPointMake(arc4random() % (int)(self.pathView.width - * self.pathView.gap), self.pathView.width - * self.pathView.gap);
- }
- - (CGPoint)randomPointD {
- return CGPointMake(, arc4random() % (int)(self.pathView.width - * self.pathView.gap));
- }
- - (UIColor *)randomColor {
- return [UIColor colorWithRed:arc4random() % / .f
- green:arc4random() % / .f
- blue:arc4random() % / .f
- alpha:0.5f];
- }
- @end
细节
注意keyPath参数。
CAShapeLayer的path动画的更多相关文章
- 用path动画绘制水波纹
用path动画绘制水波纹 效果 源码 // // ViewController.m // PathAnimation // // Created by YouXianMing on 15/7/3. / ...
- 使用CAShapeLayer的path属性与UIBezierPath画出扫描框
1.CAShapeLayer CAShapeLayer具有path属性,(是CGPath对象),可以使用这个属性与UIBezierPath画出想要的图形.该子类根据其fill color和stroke ...
- iOS | CAShapeLayer转场动画
什么也不说了,作为一名乐于分享技术的小开发,直接先上个样式最为直观贴切,有需要的朋友可以直接拿过去用. 需要demo请点击这里 :github 在这个demo中,核心为选用画布CAShapeLayer ...
- CAShapeLayer+CADisplayLink 波浪动画
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #1e9421 } p.p2 { margin: 0.0px 0. ...
- svg path 动画效果
http://www.zhangxinxu.com/wordpress/2014/04/animateion-line-drawing-svg-path-%E5%8A%A8%E7%94%BB-%E8% ...
- iOS酷炫动画效果合集
iOS酷炫动画效果合集 源码地址 https://github.com/YouXianMing/Animations 效果绝对酷炫,包含了多种多样的动画类型,如POP.Easing.粒子效果等等,虽然 ...
- 动画黄金搭档:CADisplayLink&CAShapeLayer
我们在开发中有时会遇到一些看似非常复杂的动画,不知该如何下手,今天的这篇文章中我会讲到如何利用CADisplayLink和CAShapeLayer来构建一些复杂的动画,希望能在你下次构建动画中,给你一 ...
- 动画黄金搭档:CADisplayLink & CAShapeLayer
我们在开发中有时会遇到一些看似非常复杂的动画,不知该如何下手,今天的这篇文章中我会讲到如何利用CADisplayLink和CAShapeLayer来构建一些复杂的动画,希望能在你下次构建动画中,给你一 ...
- iOS开发——图形编程Swift篇&CAShapeLayer实现圆形图片加载动画
CAShapeLayer实现圆形图片加载动画 几个星期之前,Michael Villar在Motion试验中创建一个非常有趣的加载动画. 下面的GIF图片展示这个加载动画,它将一个圆形进度指示器和圆形 ...
随机推荐
- PHP性能调优---PHP-FPM配置及使用总结
PHP-FPM配置及使用总结: php-FPM是一个PHP FastCGI的管理器,它实际上就是PHP源代码的补丁,旨在将FastCGI进程管理引进到PHP软件包中,我们必须将其patch到PHP源代 ...
- 浏览器开启web通知。
https://www.cnblogs.com/xcsn/p/7767092.html
- gluster学习(一)
2)Bricks • Brick是一个节点和一个导出目录的集合,e.g. node1:/brick1 • Brick是底层的RAID或磁盘经XFS或ext4文件系统格式化而来,所以继承了文件系统的限制 ...
- 再议js的传递和深复制
病理 基本类型的传递就是按值传递,比如说 var a = 1; var b = a; b = 3; console.log(a,b);//1,3 很明显,a的值并未因为b的值改变而变化,这是因为a只是 ...
- Ionic入门三:列表
列表是一个应用广泛的界面元素,在所有移动app中几乎都会使用到. 列表可以是基本文字.按钮,开关,图标和缩略图等. 列表项可以是任何的HTML元素.容器元素需要list类,每个列表项需要使用item类 ...
- 第一个iOS程序:Hello iOS
今天我们来创建第一个iOS程序:Hello iOS!不需要写任何代码就能实现:
- thinkphp 5.0 lnmp环境下 无法访问,报错500(public目录)
两种方法: 1.修改fastcgi的配置文件 /usr/local/nginx/conf/fastcgi.conf fastcgi_param PHP_ADMIN_VALUE "open_b ...
- 异步任务 -- FutureTask
任务提交 之前在分析线程池的时候,提到过 AbstractExecutorService 的实现: public Future<?> submit(Runnable task) { if ...
- awk 基本函数用法
gsub函数有点类似于sed查找和替换.它允许替换一个字符串或字符为另一个字符串或字符,并以正则表达式的形式执行.第一个函数作用于记录$0,第二个gsub函数允许指定目标,然而,如果未指定目标,缺省为 ...
- 【Performance】chrome调试面板
本篇文章以chrome版本67.0.3396.99为例,说明性能方面的调试.