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动画的更多相关文章

  1. 用path动画绘制水波纹

    用path动画绘制水波纹 效果 源码 // // ViewController.m // PathAnimation // // Created by YouXianMing on 15/7/3. / ...

  2. 使用CAShapeLayer的path属性与UIBezierPath画出扫描框

    1.CAShapeLayer CAShapeLayer具有path属性,(是CGPath对象),可以使用这个属性与UIBezierPath画出想要的图形.该子类根据其fill color和stroke ...

  3. iOS | CAShapeLayer转场动画

    什么也不说了,作为一名乐于分享技术的小开发,直接先上个样式最为直观贴切,有需要的朋友可以直接拿过去用. 需要demo请点击这里 :github 在这个demo中,核心为选用画布CAShapeLayer ...

  4. 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. ...

  5. svg path 动画效果

    http://www.zhangxinxu.com/wordpress/2014/04/animateion-line-drawing-svg-path-%E5%8A%A8%E7%94%BB-%E8% ...

  6. iOS酷炫动画效果合集

    iOS酷炫动画效果合集 源码地址 https://github.com/YouXianMing/Animations 效果绝对酷炫,包含了多种多样的动画类型,如POP.Easing.粒子效果等等,虽然 ...

  7. 动画黄金搭档:CADisplayLink&CAShapeLayer

    我们在开发中有时会遇到一些看似非常复杂的动画,不知该如何下手,今天的这篇文章中我会讲到如何利用CADisplayLink和CAShapeLayer来构建一些复杂的动画,希望能在你下次构建动画中,给你一 ...

  8. 动画黄金搭档:CADisplayLink & CAShapeLayer

    我们在开发中有时会遇到一些看似非常复杂的动画,不知该如何下手,今天的这篇文章中我会讲到如何利用CADisplayLink和CAShapeLayer来构建一些复杂的动画,希望能在你下次构建动画中,给你一 ...

  9. iOS开发——图形编程Swift篇&CAShapeLayer实现圆形图片加载动画

    CAShapeLayer实现圆形图片加载动画 几个星期之前,Michael Villar在Motion试验中创建一个非常有趣的加载动画. 下面的GIF图片展示这个加载动画,它将一个圆形进度指示器和圆形 ...

随机推荐

  1. #JS Ajax的error函数

    使用jquery的ajax方法向服务器发送请求的时候,常常需要使用到error函数进行错误信息的处理, 一般error函数返回的参数有三个: function(jqXHR jqXHR, String ...

  2. android拾遗——Android之Notification和NotificationManager

    1.使用系统自带的Notification //创建一个NotificationManager的引用 String ns = Context.NOTIFICATION_SERVICE; Notific ...

  3. Ionic Js三:下拉刷新

    在加载新数据的时候,我们需要实现下拉刷新效果,代码如下: HTML 代码 <body ng-app="starter" ng-controller="actions ...

  4. Python 多线程 实例

    多线程实例 import threading import time def eat(): eatTime = time.time() for i in range(30): print('count ...

  5. POJ - 2785 4 Values whose Sum is 0 二分

    4 Values whose Sum is 0 Time Limit: 15000MS   Memory Limit: 228000K Total Submissions: 25615   Accep ...

  6. CentOS通过光盘启动救援数据

    (1).CentOS6 1)首先确保实体机有光盘,虚拟机有光盘镜像.并通过BIOS设置从光盘启动,实体机请通过提示进入BIOS,虚拟机请找到上方菜单中虚拟机-->电源-->打开电源时进入固 ...

  7. string rune byte 的关系

    在Go当中 string底层是用byte数组存的,并且是不可以改变的. 例如 s:="Go编程" fmt.Println(len(s)) 输出结果应该是8因为中文字符是用3个字节存 ...

  8. django中两张表有外键关系的相互查找方法,自定义json编码方法

    两张通过外键联系的表,如何在一张表上根据另一张表上的属性查找满足条件的对象集? 平常查找表中数据的条件是python中已有的数据类型,通过名字可以直接查找.如果条件是表中外键列所对应表的某一列,该如何 ...

  9. HDU 3949 XOR 线性基

    http://acm.hdu.edu.cn/showproblem.php?pid=3949 求异或第k小,结论是第k小就是 k二进制的第i位为1就把i位的线性基异或上去. 但是这道题和上一道线性基不 ...

  10. 转 TCP/IP的三次握手与四次挥手详解

    TCP((Transmission Control Protocol)传输控制协议,是一个面向连接的协议.在运用此协议进行数据传输前都会进行连接的建立工作(三次握手):当数据传输完毕,连接的双方都会通 ...