CALayer动画之一CAGradientLayer,让渐变色动起来

最近在搞这样一个动画:

动效.gif

介绍:
最近项目需求做了这样一个动效,其中涉及到的技术点做个总结,好留个笔记。此篇文章旨在实现卡通人物的眼镜和脖子上戴的金牌上面那一道白光闪过的效果。至于动效上其他关于CAShapeLayer + UIBezierPath 画渐变色圆和线的动画放在下一章去谈。

可能你感觉,这不就是一个简单的位移动画吗,给白光图片做一个位移效果不就好了吗,那实现起来简直low逼透了。位置把控不好先不谈,白光闪过去的丝滑效果也远不及使用渐变色CAGradientLayer。用渐变色来实现这个效果的灵感来源于 iOS_Animations_by_Tutorials 这本书。

开始代码之前,先来了解下CAGradientLayer:

CAGradientLayer的属性

colors: 存放颜色的数组。
locations: 对应数组中颜色的位置。
startPoint, endPoint: 渐变色的起始位置和结束位置。
type: 渐变的类型,可以是颜色像素均匀变化,只有一个默认选择axial

好了,上代码

//首先自定义一个UIImageView
class LeftGlassesImage: UIImageView {
}
//然后在LeftGlassesImage中定义一个渐变色layer实例
    let gradientLayer: CAGradientLayer = {
        let gradientLayer = CAGradientLayer()
        //渐变色起始和结束位置如果是(x: 0,y: 0.5)-> (x: 1,y: 0.5)
        //代表水平方向渐变,这里我设置的是让他有一个偏转角度的
        // 下面有详细的关于渐变方向的图解
        gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.4)
        gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.6)
        
        //颜色数组,两头透明色,中间白色,这样可以凸显出白光
        let colors = [
            UIColor.clear.cgColor,
            UIColor.white.cgColor,
            UIColor.white.cgColor,
            UIColor.clear.cgColor
        ]
        gradientLayer.colors = colors
        
        //初始位置是关键所在,locations的位置元素对应着colors数组
        //中的颜色元素。这个location是所有的颜色点占整个渐变layer
        //宽度的比例。-0.4的值代表着clearColor的X值在
        // - layer.width * 0.4 这个位置。-0.39 -> -0.24 说明白色区域的
        //  宽度是 layer.width 的0.25倍。
        let locations: [NSNumber] = [
             -0.4,
             -0.39,
             -0.24,
             -0.23
        ]
        gradientLayer.locations = locations
        
        return gradientLayer
    }()
渐变方向示意图.png

下面重写layoutSubviews,设置gradientLayer 的frame,并把他添加到self上。

    override func layoutSubviews() {
        layer.borderColor = UIColor.green.cgColor
        gradientLayer.frame = CGRect(
            x: -5,
            y: 0,
            width: bounds.size.width ,
            height: bounds.size.height)
        
        layer.addSublayer(gradientLayer)
        
    }

剩下的就是添加动画了:

    override func didMoveToWindow() {
        super.didMoveToWindow()
        
        //动画的keyPath选择locations属性,说明我们要动画的对象
        //是locations数组。
        let gradientAnimation = CABasicAnimation(keyPath: "locations")
        //有了上面对于locations的解释,想让渐变色动起来
        //我们的动画起始位置和结束位置这样设置,也并不难理解了
        gradientAnimation.fromValue = [-0.8,-0.79,-0.64,-0.63]
        gradientAnimation.toValue = [1.5,1.51,1.76,1.77]
        gradientAnimation.duration = 1.0
        gradientAnimation.repeatCount = 2
        
        gradientLayer.add(gradientAnimation, forKey: nil)
    }

代码地址 ,后续会不断更新文中一些动画的实现方式。

推荐阅读更多精彩内容

  • 练习11-提问 练习程序 课后练习 练习程序 运行结果 课后练习 其他课后练习及问题就不看了,主要网上找资料对比了...
    Demoary阅读 376评论 0 50
  • 这周末和辣不怕小伙伴们再次去了长沙。第二次踏上长沙这片土地,再次感受到了她的热情。 二个多小时的高铁,让我们从祖国...
    听风Listening阅读 30评论 0 0
  • 今天是五四青年节,虽然年纪不年轻了,但要保持年轻人的心情,今晚,吃着豌豆,竟然编了一首宝宝歌! 吃豌豆吃豌豆,我的...
    天使小鱼儿阅读 112评论 4 5
  • mind#真正强大的内心是更柔和客观地看待世界,是对内心柔性的追求,海纳百川般的淡定与包容。“生活中只有一种英雄主...
    TingEva阅读 10评论 0 0