iOS CAReplicatorLayer 实现脉冲动画效果

效果图

脉冲数量、速度、半径、透明度、渐变颜色、方向等都可以设置。可以用于地图标注(Annotation)、按钮长按动画效果(例如录音按钮)等。

代码已上传 GitHub:https://github.com/Silence-GitHub/CoreAnimationDemo

实现原理

实现方法参考:https://github.com/shu223/Pulsator

但是觉得那些代码不够简洁,所以自己写了一个,还加了些功能。

自定义 PulsatorLayer,继承自 CAReplicatorLayer。CAReplicatorLayer 可以复制子图层(Sublayer),被复制出来的子图层可以改变位置、颜色等属性。每一个脉冲(一个渐变的圆形)就是一个被复制出来的子图层。

显示脉冲的图层就是子图层,把它作为 pulseLayer 属性

private var pulseLayer: CALayer!

脉冲子图层一开始不显示,因此初始化时为全透明;通过设置圆角,使 pulseLayer 为圆形

pulseLayer = CALayer()
pulseLayer.opacity = 0
pulseLayer.backgroundColor = outColor
pulseLayer.contentsScale = UIScreen.main.scale
pulseLayer.bounds.size = CGSize(width: maxRadius * 2, height: maxRadius * 2)
pulseLayer.cornerRadius = maxRadius
addSublayer(pulseLayer)

设置 CAReplicatorLayer 的一些属性

// The number of copies to create, including the source layers
instanceCount
// Specifies the delay, in seconds, between replicated copies
instanceDelay

设置复制子图层的数量、创建两个子图层之间的时间间隔。

CAReplicatorLayer 遵循 CAMediaTiming 协议,设置协议属性

// Determines the number of times the animation will repeat
repeatCount = MAXFLOAT

把动画重复次数设置为很大的数,让动画一直重复。

动画效果由 3 个 CABasicAnimation 组成,分别改变脉冲的大小、透明度、背景色颜色

let scaleAnimation = CABasicAnimation(keyPath: "transform.scale.xy")
scaleAnimation.duration = animationDuration let opacityAnimation = CABasicAnimation(keyPath: "opacity")
opacityAnimation.duration = animationDuration let colorAnimation = CABasicAnimation(keyPath: "backgroundColor")
colorAnimation.duration = animationDuration switch pulseOrientation {
case .out:
scaleAnimation.fromValue = minRadius / maxRadius
scaleAnimation.toValue = 1 opacityAnimation.fromValue = maxAlpha
opacityAnimation.toValue = minAlpha colorAnimation.fromValue = inColor
colorAnimation.toValue = outColor case .in:
scaleAnimation.fromValue = 1
scaleAnimation.toValue = minRadius / maxRadius opacityAnimation.fromValue = minAlpha
opacityAnimation.toValue = maxAlpha colorAnimation.fromValue = outColor
colorAnimation.toValue = inColor
} let animationGroup = CAAnimationGroup()
animationGroup.duration = animationDuration + animationInterval
animationGroup.animations = [scaleAnimation, opacityAnimation, colorAnimation]
animationGroup.repeatCount = repeatCount
pulseLayer.add(animationGroup, forKey: kPulseAnimationKey)

以上代码判断了脉冲的方向(由内向外、由外向内),两种方向的动画属性起止取值相反。把这 3 个 CABasicAnimation 加入 CAAnimationGroup 中一起执行。

以上就是实现原理与最核心的代码,具体见 GitHub:https://github.com/Silence-GitHub/CoreAnimationDemo

转载请注明出处:http://www.cnblogs.com/silence-cnblogs/p/6951948.html

iOS CAReplicatorLayer 实现脉冲动画效果的更多相关文章

  1. 轻松实现Android,iOS的一个手势动画效果

    先来看效果 这是iOS下的效果,android下完全一致.通过do_GestureView组件和do_Animation组件,deviceone能很容易实现复杂的跨平台纯原生动画效果,这个示例就是通过 ...

  2. iOS开发 QQ粘性动画效果

    QQ(iOS)客户端的粘性动画效果 时间 2016-02-17 16:50:00  博客园精华区 原文  http://www.cnblogs.com/ziyi--caolu/p/5195615.ht ...

  3. iOS开发之吸附动画效果

    步骤:1.使用singleviewapplication创建新的项目 2.在.h文件中创建两张图片的实例对象,并与相关的图片进行相连:创建一个UIDynamicAnimator实例对象 3.在.m文件 ...

  4. iOS tabbar点击动画效果实现

    正常情况下,我们点击tabbar都只有一个变色效果,但有时候,如果我们想给它添加一个点击动画,该如何做呢? 先上几个效果图: 1.先放大,再缩小 2.Z轴旋转               3.Y轴位移 ...

  5. ios开发之--简单动画效果的添加

    记录一个简单的动画效果,自己写的,很简单,仅做记录. 附一个demo的下载地址: https://github.com/hgl753951/hglTest.git 代码如下: 1,准备 BOOL _i ...

  6. ios 自定义加载动画效果

    在开发过程中,可能会遇到各种不同的场景需要等待加载成功后才能显示数据.以下是自定义的一个动画加载view效果.      在UIViewController的中加载等到效果,如下 - (void)vi ...

  7. iOS 圆的放大动画效果

    第一步:创建一个View,将这个View添加到当前的控制器 如: CGFloat timeW = self.view.bounds.size.width; timeAnimation * timean ...

  8. iOS - 落叶加载动画效果

    代码下载地址:https://github.com/nLoser/LeafLoadingView 效果: 说明:效果是在网上看到的,并且自己按照效果自己实现,树叶使用CAEmitterLayer做的, ...

  9. iOS 开发之推力动画效果

    步骤: 1.使用single view application 创建新的项目 2.在.h文件中需要遵守两个协议<UICollisionBehaviorDelegate,UIGestureReco ...

随机推荐

  1. JSSDK微信自定义分享

    背景:15年之前的微信分享只需要加入一段js就可以实现.后来微信官方全部禁止了.现在的微信分享全部得使用jssdk. 一.分享功能: 在微信内(必须在微信里)打开网站页面,分享给朋友或者分享到朋友圈时 ...

  2. margin外边距合并问题以及解决方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. [系统启动]Printk与sched_clock_init的一点分析

     作者:Younger Liu, 本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可. 在分析Linu内核启动的过程中,发现一段"不平常" ...

  4. Azure IoT 技术研究系列5-Azure IoT Hub与Event Hub比较

    上篇博文中,我们介绍了Azure IoT Hub的使用配额和缩放级别: Azure IoT 技术研究系列4-Azure IoT Hub的配额及缩放级别 本文中,我们比较一下Azure IoT Hub和 ...

  5. Angular简易分页设计(二):封装成指令

    (首先声明本文来自博客园本人原创,转载请说明出处.欢迎关注:http://www.cnblogs.com/mazhaokeng/) 之前我们讲过,Angular分页代码确实不难实现,但是由于在多个路由 ...

  6. windows下使用IIS的ARR实现站点的负载均衡

    1)    目的: 访问localhost:18066 对下边两个端口负载 localhost:18098 localhost:18099 2)    手段: 1.通过nginx 2.通过iis的AR ...

  7. 使用 Laravel 实现微型博客系统

    参考链接:An Introduction to Laravel Authorization Gates 这个微型博客系统包含两个用户角色(作者 和 编辑),它们的权限如下: 作者能创建博客 作者能更新 ...

  8. javascript 六种数据类型(一)

    js的数据类型和常见隐式转化逻辑. 一.六种数据类型 原始类型(基本类型):按值访问,可以操作保存在变量中实际的值.原始类型汇总中null和undefined比较特殊. 引用类型:引用类型的值是保存在 ...

  9. java:Comparable比较器

    /*Comparable 是java.lang中的一个接口,所以是默认导入的,不需要显示的导入. *如果你先直接在本类中实现排序,那么可以直接实现该接口(例如:public class Compara ...

  10. OC中自定义构造方法

    格式 -(instancetype)init(){ self=[super init] if(self){ } return self; } 自定义构造方法规范 1)一定是对象方法,以减号开头 2)返 ...