好久不见
有一项目有这么一个需求,当定位信号离开某个区域时,要把这个信号列为告警信号,并且要用相应的标志标记此信号。
标记一个告警的定位信号,当然用一个类似雷达、波浪效果的动画去实现。(其实实现的方式有很多)脑海中里面浮现下面一个画面:
这个动画容易实现么?当然容易。可为什么还要写出来,很显然,很久没写简书了嘛。
说白了,这很可能是一个组合动画,scale和opacity的组合动画!当然颜色还可以random一下,更加炫彩,这里为了尊重项目,就不搞事情啦~
直接上!
let scaleAnimation = CABasicAnimation(keyPath: "transform.scale.xy")
scaleAnimation.fromValue = 0.0
scaleAnimation.toValue = 1.0
scaleAnimation.duration = 2
scaleAnimation.isRemovedOnCompletion = true
let opacityAnimation = CAKeyframeAnimation(keyPath: "opacity")
opacityAnimation.duration = 2
opacityAnimation.values = [1,0.5,0.3,0]
opacityAnimation.keyTimes = [0,0.3,0.6,1]
opacityAnimation.isRemovedOnCompletion = true
self.animationGroup = CAAnimationGroup()
self.animationGroup.duration = 2
self.animationGroup.isRemovedOnCompletion = false
self.animationGroup.fillMode = kCAFillModeForwards
self.animationGroup.delegate = self
self.animationGroup.animations = [scaleAnimation,opacityAnimation]
定义好这些动画,就可以添加到layer上了~
let _layer = CALayer()
_layer.cornerRadius = self.bounds
.width/2
_layer.frame = CGRect(x: 0, y: 0, width: self.bounds.width, height: self.bounds.width)
_layer.backgroundColor = UIColor.red.cgColor
_layer.add(self.animationGroup, forKey: nil)
self.layer.addSublayer(_layer)
self.perform(#selector(self.removeLayer(_:)), with: _layer, afterDelay: 2)
在哪里调用?
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.displayLink = CADisplayLink(target: self, selector: #selector(self.displayLinkFunc))
self.displayLink?.preferredFramesPerSecond = 3
self.displayLink?.add(to: RunLoop.current, forMode: .defaultRunLoopMode)
}
这里用CADisplayLink去循环执行动画,与NSTimer和Dispatch是有区别的。
结束
这动画实现起来并不难,主要目的是刷刷简书圈儿~