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图片展示这个加载动画,它将一个圆形进度指示器和圆形 ...
 
随机推荐
- 使用EasyWechat快速开发微信公众号支付
			
前期准备: 申请微信支付后, 会收到2个参数, 商户id,和商户key.注意,这2个参数,不要和微信的参数混淆.微信参数: appid, appkey, token支付参数: merchant_id( ...
 - USACO 6.3 Cowcycles
			
CowcyclesOriginally by Don Gillies [International readers should note that some words are puns on co ...
 - 010 secondary namenode(同步元数据和日志)
			
1.格式化 首先格式化之后只剩下一个根目录. 格式化后会出现元数据 集群启动之后,元数据放在内存中的(消耗内存中) 格式化后会产生镜像文件fsimage,元数据存储 启动的时候namenode会读取镜 ...
 - JMeter导入jmx运行脚本时出现这样的错误jmeter.save.SaveService: Conversion error com.thoughtworks.xstream.converters.ConversionException:
			
2016/12/20 13:51:55 ERROR - jmeter.save.SaveService: Conversion error com.thoughtworks.xstream.conve ...
 - PHP验证时有用的几段代码
			
1.htmlspecialchars() htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体.预定义的字符是: & (和号) 成为 & " ( ...
 - UVA - 11995 - I Can Guess the Data Structure!  STL 模拟
			
There is a bag-like data structure, supporting two operations: 1 x Throw an element x into the bag. ...
 - Redis和MySQL数据一致中出现的几种情况
			
1. MySQL持久化数据,Redis只读数据 redis在启动之后,从数据库加载数据. 读请求: 不要求强一致性的读请求,走redis,要求强一致性的直接从mysql读取 写请求: 数据首先都写到数 ...
 - github下载项目
 - Django MiddleWare初识
			
一.Django 中间件介绍 中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定 ...
 - 线性表之顺序栈C++实现
			
线性表之顺序栈 栈是限定仅在表尾(栈顶)进行插入删除操作的线性表,FILO:先进后出 一.顺序栈的头文件:SeqStack.h //顺序栈头文件 #include<iostream> us ...