这里主要介绍使用 container layer 实现 replicate animations。

创建一个形状,一个图像或者任何可以用图层绘制的东西, CAReplicatorLayer 可以在屏幕上复制它。效果如下:

CAReplicatorLayer 的强悍在于: 你可以很容易地指导它使每个克隆体与它稍有不同。

例如,我们可以逐步更改每个副本的颜色。我们的原始层可以是洋红色的,当我们创建每个副本时,其颜色将向青色渐变。

此外,我们还可以在副本之间进行转换。例如,我们可以在每个副本之间应用一个简单的旋转变换,将它们绘制成一个圆圈,如图所示:

但是更强大的功能是我们可以为每个拷贝层进行动画延迟。当我们将一个instanceDelay 设为 0.2 秒,并在原始 layer 中添加一个动画时,第一个拷贝 layer 将延迟 0.2 秒动画,第二个拷贝 layer 将延迟 0.4 秒动画,第三个拷贝 layer 延迟 0.6 秒动画,以此类推。

我们可以同时添加多个动画特效来创建引人入胜的复杂动画。

复制多个动画

######Scale animation

let scale = CABasicAnimation(keyPath: "transform")
scale.fromValue = NSValue(caTransform3D: CATransform3DIdentity)
scale.toValue = NSValue(caTransform3D:CATransform3DMakeScale(1.4, 15, 1.0))
scale.duration = 0.33
scale.repeatCount = .infinity
scale.autoreverses = true
scale.timingFunction = CAMediaTimingFunction(name:kCAMediaTimingFunctionEaseOut)
dot.add(scale, forKey: "dotScale")
复制代码

其中 CATransform3D 的数据结构定义了一个同质的三维变换(4x4 CGFloat值的矩阵),用于图层的旋转,缩放,偏移,歪斜和应用的透视。

CATransform3DIdentity 是单位矩阵,该矩阵没有缩放,旋转,歪斜,透视。该矩阵应用到图层上,就是设置默认值。

变换函数 CATransform3DMakeTranslation:

对于CATransform3D来说,它是一个4x4 CGFloat的矩阵:[1 0 0 0; 0 1 0 0; 0 0 1 0; tx ty tz 1]。

给竖起来后。就发现:

1    0    0    0
0    1    0    0
0    0   1     0
tx  ty   tz    1
复制代码

CATransform3D 是一个结构。他有自己的一个公式,可以进行套用。

struct CATransform3D
{
CGFloat    m11(x缩放), m12(y切变),m13(旋转), m14();
CGFloat    m21(x切变), m22(y缩放),m23() ,   m24();
CGFloat    m31(旋转) , m32( ),   m33() ,    m34(透视);
CGFloat    m41(x平移), m42(y平移),m43(z平移), m44();
};
复制代码

m34(透视效果,要操作的这个对象要有旋转的角度,否则没有效果。正直/负值都有意义)

CATransform3D CATransform3DMakeScale (CGFloat sx, CGFloat sy, CGFloat sz);

sx:X轴缩放,代表一个缩放比例,一般都是 0 -- 1 之间的数字。 sy:Y轴缩放。 sz:整体比例变换时,也就是 m11(sx)== m22(sy)时,若 m33(sz)>1,图形整体缩小,若 sz <1,图形整体放大,若 m33(sz)<0,发生关于原点的对称等比变换。

Opacity animation

将 dot layer 淡入、淡出,将使波具有一定的维数,并随着波的增大和减小而改变 alpha 的值,以模拟光的情况。它看起来就像一个旋转的弯曲的丝带糖果:

实现代码如下:

let fade = CABasicAnimation(keyPath: "opacity")
fade.fromValue = 1.0
fade.toValue = 0.2
fade.duration = 0.33
fade.beginTime = CACurrentMediaTime() + 0.33
fade.repeatCount = .infinity
fade.autoreverses = true
fade.timingFunction = CAMediaTimingFunction(name:kCAMediaTimingFunctionEaseOut)
dot.add(fade, forKey: "dotOpacity")
复制代码

在缩放动画的持续时间内,将 dot layer 的 opacity 从 1.0 降低到 0.2 。这一次,开始动画的延迟是 0.33 秒。当波浪达到最大时,就会开始消退效应。

Tint animation

有了波浪形动画,给它们上色成彩色是不是更好呢?

加色彩很简单,如下:

let tint = CABasicAnimation(keyPath: "backgroundColor")
tint.fromValue = UIColor.magenta.cgColor
tint.toValue = UIColor.cyan.cgColor
tint.duration = 0.66
tint.beginTime = CACurrentMediaTime() + 0.28
//  kCAFillModeRemoved – 此为默认值,layer在动画前的属性值一直为origin value,动画开始时属性值立马切换到from value,然后动画变化到to value,动画结束时属性值又立马切换到origin value;
//  kCAFillModeForwards – layer在动画结束时仍然保持属性值为to value;
//  kCAFillModeBackwards – layer在动画前就将属性值切换到origin value;
tint.fillMode = kCAFillModeBackwards
tint.repeatCount = .infinity
tint.autoreverses = true
tint.timingFunction = CAMediaTimingFunction(name:kCAMediaTimingFunctionEaseInEaseOut) dot.add(tint, forKey: "dotColor")
复制代码

这个动画改变 dot layer 的颜色从洋红色到青色再到洋红色,如此循环。动画持续时间 0.66 秒,这是缩放动画频率的两倍。

我们还给动画延迟了 0.28 秒,这使得色彩色调动画在波形出现 “扭曲” 之前就开始了。 这种微妙的效果在波浪 “扭曲” 之前提供了下一种颜色的暗示,好像有一些反射正在进行。

Animating CAReplicatorLayer properties

我们可以为 CAReplicatorLayer 的基本属性(如position,backgroundColor或cornerRadius)设置动画,可以通过设置此图层中存在,其它图层中不存在的某些特殊属性来创建一些有趣的效果。

CAReplicatorLayer 可动画的属性有:

• instanceDelay: 动画实例之间的延迟量 • instanceTransform: 进行 3D 变换 • instanceColor: 更改用于所有实例的混合颜色 • instanceRedOffset, instanceGreenOffset, instanceBlueOffset: 实例颜色组件的应用增量 • instanceAlphaOffset: 实例的不透明度增量

为语音波浪添加特效

let initialRotation = CABasicAnimation(keyPath:"instanceTransform.rotation")
initialRotation.fromValue = 0.0
initialRotation.toValue = 0.01
initialRotation.duration = 0.33
initialRotation.isRemovedOnCompletion = false
initialRotation.fillMode = kCAFillModeForwards
initialRotation.timingFunction = CAMediaTimingFunction(name:kCAMediaTimingFunctionEaseOut)
replicator.add(initialRotation, forKey: "initialRotation")
复制代码

将实例之间的旋转设置为 0.0 弧度到 0.01 弧度。 与其邻居相比,每个复制 layer 都会略微旋转。

继续添加动画:

let rotation = CABasicAnimation(keyPath: "instanceTransform.rotation") rotation.fromValue = 0.01
rotation.toValue = -0.01
rotation.duration = 0.99
rotation.beginTime = CACurrentMediaTime() + 0.33
rotation.repeatCount = .infinity
rotation.autoreverses = true
rotation.timingFunction = CAMediaTimingFunction(name:kCAMediaTimingFunctionEaseInEaseOut) replicator.add(rotation, forKey: "replicatorRotation")
复制代码

这里,在 instanceTransform.rotation 上运行第二个动画,该动画在第一个动画完成后启动,它将变换旋转从 0.01 弧度(第一个动画的最终值)设置为 -0.01 弧度,然后自动反循环。

demo下载

参考:

  1. 关于CATransform3D
  2. 显式动画

转载于:https://juejin.im/post/5c3e835bf265da6164143e05

iOS 动画十四:Replicating Animations相关推荐

  1. (素材源码)猫猫学IOS(十四)UI之UITableView扩充_表格的修改_(增删移动)

    猫猫分享,必须精品 素材代码地址:http://download.csdn.net/detail/u013357243/8544315 原文地址:http://blog.csdn.net/u01335 ...

  2. iOS 11开发教程(十四)iOS11应用代码添加视图

    iOS 11开发教程(十四)iOS11应用代码添加视图 如果开发者想要使用代码为主视图添加视图,该怎么办呢.以下将为开发者解决这一问题.要使用代码为主视图添加视图需要实现3个步骤. (1)实例化视图对 ...

  3. 十四款常用动画制作软件

    一.Ulead GIF Animator V5.05 汉化绿色特别版 GIF动画制作软件 下载地址 http://www.duote.com/soft/15782.html [基本介绍] 友立公司出版 ...

  4. 有趣的HTML实例(十四) 窗边风景动画(css+js)

    不要憎恨你的敌人,那会影响你的判断力. --<教父> 目录 一.前言 二.往期作品回顾 三.作品介绍 四.本期代码介绍 五.效果显示 六.编码实现 index.html style.css ...

  5. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(二十四) Be careful!前方怪物出没...

    游戏的精灵框架到此为止算告一段落,让我们一同来体验它带来的神奇效应. 一个安静的黄昏,主角悠闲的甩着它帅气的毛发独跑于林阴大道.怎知天色已晚即将进入月亮的领地,嘿嘿,我们的故事就从这里开始:Be ca ...

  6. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(二十四) Be careful!前方怪物出没

    游戏的精灵框架到此为止算告一段落,让我们一同来体验它带来的神奇效应. 一个安静的黄昏,主角悠闲的甩着它帅气的毛发独跑于林阴大道.怎知天色已晚即将进入月亮的领地,嘿嘿,我们的故事就从这里开始:Be ca ...

  7. iOS动画-CAAnimation使用详解

    理解了隐式动画后,显式动画就更加通俗易懂了.区别于隐式动画的特点,显式动画就是需要我们明确指定类型.时间等参数来实现效果的动画.除此之外,我们也可以创建非线性动画,比如沿着任意一条曲线运动等: 我们平 ...

  8. iOS动画系列之八:使用CAShapeLayer绘画动态流量图

    这篇文章通过使用CAShapeLayer和UIBezierPath来画出一个动态显示剩余流量的小动画. 最终实现的效果如下: Paste_Image.png 动态效果图: shapeLayerAni. ...

  9. iOS动画系列之九:实现点赞的动画及播放起伏指示器

    iOS动画系列,共十篇.现在写到第九篇啦.感兴趣的可以通过下面的传输门进到其他几篇文章里面. 第一篇:iOS动画系列之一:通过实战学习CALayer和透视的原理.做一个带时分秒指针的时钟动画(上) 第 ...

  10. iOS动画系列之五:基础动画之缩放篇旋转篇Swift+OC

    这一篇主要介绍基础动画之缩放和旋转.这些基本操作分享完之后,我想想可以找个稍微复杂一点点的动画做做啦. 这篇继续基础篇,分享一下缩放和旋转.因为整体思路和平移基本上没有变化,加上源代码里面也有OC版本 ...

最新文章

  1. 特殊权限控制之SUID、SGID、Sticky及facl
  2. MySQL的user表
  3. MySQL repeat复制函数示例
  4. 从ffmpeg源代码分析如何解决ffmpeg编码的延迟问题(如何解决编码 0 延时)
  5. 如何直接强制客户端刷新.js文件
  6. oracle添加表的索引,oracle批量添加指定表前缀的索引SQL语句
  7. 服务器无法在发送 http 标头之后设置内容类型。_python socket编程预知内容
  8. 实验4 C++程序的结构(4学时)
  9. JavaScript函数的两种声明方式(4)
  10. Python读取并遍历CSV数据
  11. cent OS 6.3 yum方式安装openldap,phppldapadmin,lam
  12. 解决ojdbc14库引用问题
  13. 引用阿里图标库(iconFont)的三种方式
  14. 如何用电路实现检测过零点?这个简单电路就能搞定
  15. 仿滴滴打车时间选择器开始结束时间
  16. Unity Shader-真实下雨路面
  17. MobaXterm - 远程连接工具
  18. 【笔记】Spring Security Oauth2-请求方式无法获取token
  19. Pycharm terminal激活虚拟环境
  20. 黑马程序员_Java基础_前期准备02-1

热门文章

  1. 2017.5.20欢(bei)乐(ju)赛解题报告
  2. poj 1276 Cash Machine(多重背包)
  3. SQL注入盲注——布尔注入
  4. idea中 Application Server not specified
  5. 20155204《网络对抗》Exp 6 信息搜集与漏洞扫描
  6. MSIL实用指南-struct的生成和操作
  7. 【总结】Unity游戏优化
  8. 机器学习 - pycharm, pyspark, spark集成篇
  9. 设计模式学习02-观察者模式
  10. stm32如何执行软复位_stm32f7软件复位 stm32f0 软件复位