动效.gif
接上篇:
上篇实现了动画中的眼镜和金牌白光闪过的动效,这篇再来着重分析下圆弧动画。
CAShapeLayer和UIBezierPath画一条圆弧:
        //首先定义一个circle
        var circle: CAShapeLayer!
        //设置path的内容
        let startAngle: CGFloat = .pi * 0.25
        let endAngle: CGFloat = .pi * 2
        let centerX = self.backCircle.width/2
        let centerY = self.backCircle.height/2
        let center = CGPoint(x: centerX,y: centerY)
        let lineWidth: CGFloat = 16.0
        circle = CAShapeLayer()
        
        //绘制圆
        let circlePath = UIBezierPath.init(arcCenter: center, radius: 240/2, startAngle: startAngle, endAngle: endAngle, clockwise: true)
        circle.path = circlePath.cgPath
        //中间透明
        circle.fillColor = UIColor.clear.cgColor
        //临时颜色,下面会用到渐变色来渲染圆环颜色
        circle.strokeColor = UIColor.green.cgColor
        //设置线宽
        circle.lineWidth = lineWidth
        //设置圆环头部样式
        circle.lineCap = kCALineCapRound
        //把自己定义的circle 添加到 背景圆环的layer上
        backCircle.layer.addSublayer(circle)
添加动画,设置CABasicAnimation的keyPath为“strokeEnd”。
        let circleAnimation = CABasicAnimation(keyPath: "strokeEnd")
        circleAnimation.duration = 2
        circleAnimation.fromValue = 0.0
        circleAnimation.toValue = 1.0
        //动画节奏,淡出
        circleAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
        //把动画添加到layer上
        circle.add(circleAnimation, forKey: nil)
下面重点来了:
- 之所以能实现圆环的渐变色,并不是我们可以直接在layer上添加一个圆环形状的渐变色,而是创建一个通用的正方形渐变色区域,用我们的circle 作为这个渐变区域的mask来截取一个圆环形状的渐变色区域。
 - 为了制造圆环的渐变色效果,只创建一块渐变区域,那是不够的,因为那样画出来的圆左右方向的圆弧颜色是对称的,那样就太丑了,不符合整体渐变的要求。所以,我把这个正方形渐变区域垂直切分成两块渐变区域,左右区域的颜色顺序相反,起始和结束位置也相反,就可以实现圆环渐变的效果了。
 
//创建第一个gradientLayer
    let colors1 = [
        UIColor.RGBA(red: 49, green: 240, blue: 233, alpha: 1.0).cgColor,
        UIColor.RGBA(red: 69, green: 240, blue: 210, alpha: 1.0).cgColor,
        UIColor.RGBA(red: 143, green: 238, blue: 147, alpha: 1.0).cgColor,
        UIColor.RGBA(red: 220, green: 237, blue: 92, alpha: 1.0).cgColor,
        UIColor.RGBA(red: 253, green: 237, blue: 74, alpha: 1.0).cgColor
    ]
    let frame1 = CGRect(x: 0, y: 0, width: backCircle.width/2, height: backCircle.height)
    let gradientLayer1 = CAGradientLayer()
    gradientLayer1.startPoint = CGPoint(x: 0.5,y: 0)
    gradientLayer1.endPoint = CGPoint(x: 0.5,y: 1)
    gradientLayer1.frame = frame1
    gradientLayer1.colors = colors1
    //创建第二个gradientLayer
    let colors2 = [
        UIColor.RGBA(red: 253, green: 237, blue: 74, alpha: 1.0).cgColor,
        UIColor.RGBA(red: 224, green: 238, blue: 59, alpha: 1.0).cgColor,
        UIColor.RGBA(red: 148, green: 238, blue: 146, alpha: 1.0).cgColor,
        UIColor.RGBA(red: 49, green: 240, blue: 233, alpha: 1.0).cgColor,
        ]
    let frame2 = CGRect(x: backCircle.width/2, y: 0, width: backCircle.width/2, height: backCircle.height)
    let gradientLayer2 = CAGradientLayer()
    gradientLayer2.startPoint = CGPoint(x: 0.5,y: 1)
    gradientLayer2.endPoint = CGPoint(x: 0.5,y: 0)
    gradientLayer2.frame = frame2
    gradientLayer2.colors = colors2
    //用一个gradientLayer来承接这两个渐变区域
    gradientLayer.addSublayer(gradientLayer1)
    gradientLayer.addSublayer(gradientLayer2)
    //用circle的path形状来截取渐变区域
    gradientLayer.mask = circle
    backCircle.layer.addSublayer(gradientLayer)
好了,一个带有渐变色的圆环画好了。通过这两篇总结,感觉对于渐变色layer的理解更加深刻了。代码地址











网友评论