iOS动画进阶 - CAKeyframeAnimation实现过山车动画

原创 2016年06月22日 22:34:59

如果移动端访问不佳,可以访问我的个人博客

偶然间在网页上看到一个过山车动画觉得很炫,就想用swift纯代码实现了一个类似的效果,因为没有设计天赋,所以就完全高仿的人家的效果-.-下面上效果图:

wcl.gif

给大家介绍一下项目中主要会用到的类:

  • CAShapeLayer
  • CAGradientLayer
  • CAKeyframeAnimation

实现的主要思路

渐变的背景用CAGradientLayer实现,其他例如山峰,草坪和轨道可以用CAShapeLayer配合UIBezierPath实现,然后云朵,树木和大地直接用CALayer通过设置contents实现,然后云朵和过山车的动画实现用CAKeyframeAnimation,这样分析其实做一个这样的动态效果并不是很难,下面就是实现过程和简单的代码示例。下载demo有完整代码

CAGradientLayer

CAGradientLayer是用来生成两种或更多颜色平滑渐变的。相比于Core Graphics来说CAGradientLayer的真正好处在于绘制使用了硬件加速。这说明通过CAGradientLayer来绘制渐变的效果比用Core Graphics的效率更高。我们通过CAGradientLayer来实现这个项目中的背景下载demo有完整代码

//初始化背景
    func initGradientLayer(size:CGSize) -> CAGradientLayer {
        let layer:CAGradientLayer = CAGradientLayer()
        layer.frame = CGRect(x: 0, y: 0, width: size.width, height: size.height - 20)
        //设置渐变的颜色
        layer.colors = [UIColor.init(colorLiteralRed: 178.0/255.0, green: 226.0/255.0, blue: 248.0/255.0, alpha: 1.0).CGColor, UIColor.init(colorLiteralRed: 232.0/255.0, green: 244.0/255.0, blue: 193.0/255.0, alpha: 1.0).CGColor]
        //设置渐变的方向为从左上到右下
        layer.startPoint = CGPoint(x: 0, y: 0)
        layer.endPoint = CGPoint(x: 1, y: 1)
        view.layer.addSublayer(layer)
        return layer
    }

屏幕快照 2016-06-22 上午12.16.14.png

CAShapeLayer

CAShapeLayer是一个通过矢量图形而不是bitmap来绘制的图层子类。你指定诸如颜色和线宽等属性,用CGPath来定义想要绘制的图形,最后CAShapeLayer就自动渲染出来了。当然,你也可以用Core Graphics直接向原始的CALyer的内容中绘制一个路径,相比直下,使用CAShapeLayer有以下一些优点:

  • 渲染快速。CAShapeLayer使用了硬件加速,绘制同一图形会比用Core Graphics快很多。

  • 高效使用内存。一个CAShapeLayer不需要像普通CALayer一样创建一个寄宿图形,所以无论有多大,都不会占用太多的内存。

  • 不会被图层边界剪裁掉。一个CAShapeLayer可以在边界之外绘制。你的图层路径不会像在使用Core Graphics的普通CALayer一样被剪裁掉(如我们在第二章所见)。

  • 不会出现像素化。当你给CAShapeLayer3D变换时,它不像一个有寄宿图的普通图层一样变得像素化。

我们用CAShapeLayer来绘制草地,山坡和过山车的轨道,下面给大家通过绘制草坪的代码简单介绍一下用法下载demo有完整代码

//初始化草坪
    func initGrasslandlayer(size:CGSize) -> CAShapeLayer {
        let grasslandOne = CAShapeLayer()
        //通过UIBezierPath来绘制路径
        let pathOne:UIBezierPath = UIBezierPath()
        pathOne.moveToPoint(CGPoint(x: 0, y: size.height - 20))
        pathOne.addLineToPoint(CGPoint(x: 0, y: size.height - 100))
        pathOne.addQuadCurveToPoint(CGPoint(x: size.width/3.0, y: size.height - 20), controlPoint: CGPoint(x: size.width/6.0, y: size.height - 100))
        grasslandOne.path = pathOne.CGPath
        //设置草坪的颜色
        grasslandOne.fillColor = UIColor.init(colorLiteralRed: 82.0/255.0, green: 177.0/255.0, blue: 44.0/255.0, alpha: 1.0).CGColor
        view.layer.addSublayer(grasslandOne)
    }

屏幕快照 2016-06-22 上午12.28.53.png

CAKeyframeAnimation

CAKeyframeAnimation类为对象提供了关键帧动画的功能。你创建一个CAKeyframeAnimation对象使用animationWithKeyPath:指定属性的关键路径,你可以指定要使用关键帧的值来控制时间和动画的行为。我们可以通过CAKeyframeAnimation来实现过山车在轨道上的的动画和云朵的动画,下面是一小段示例代码下载demo有完整代码

//添加绿色轨道的动画
    func addGreenCarPathAnimation(size:CGSize) {
        let carLayer:CALayer = CALayer()
        carLayer.frame = CGRect(x: 0, y: 0, width: 17, height: 11)
        carLayer.contents = UIImage.init(named: "otherCar")!.CGImage

        //绘制路径
        let path:UIBezierPath = UIBezierPath()
        path.lineCapStyle = .Round
        path.lineJoinStyle = .Round
        path.moveToPoint(CGPoint(x: size.width + 10, y: size.height - 7))
        path.addLineToPoint(CGPoint(x: size.width + 10, y: size.height - 77))
        path.addQuadCurveToPoint(CGPoint(x: size.width/1.8, y: size.height - 77), controlPoint: CGPoint(x: size.width - 120, y: 193))
        path.addArcWithCenter(CGPoint(x: size.width/1.9, y: size.height - 140), radius: 63, startAngle: CGFloat(0.5*M_PI), endAngle: CGFloat(2.5*M_PI), clockwise: true)
        path.addCurveToPoint(CGPoint(x: 0, y: size.height - 107), controlPoint1: CGPoint(x: size.width/1.8 - 60, y: size.height - 67), controlPoint2: CGPoint(x: 150, y: size.height/2.3-7))
        path.addLineToPoint(CGPoint(x: -100, y: size.height + 7))

        //关键帧动画作用于position
        let animation:CAKeyframeAnimation = CAKeyframeAnimation.init(keyPath: "position")
        animation.path = path.CGPath
        //动画节奏为线性动画
        animation.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionLinear)
        //动画时间
        animation.duration = 6
        //动画重复次数
        animation.repeatCount = MAXFLOAT
        //动画是否逆转
        animation.autoreverses = false
        //动画速度为匀速
        animation.calculationMode = kCAAnimationCubicPaced
        //动画角度是否调整
        animation.rotationMode = kCAAnimationRotateAuto
        view.layer.addSublayer(carLayer)
        carLayer.addAnimation(animation, forKey: "carAnimation")
    }

上面的代码只是简单的示例,完整代码得去我的github上去下载,到这里也就基本上完成了,大家有什么疑问可以留言评论,谢谢大家的观看

demo地址

参考文档(非常好的一篇关于介绍CALayer的中文翻译文档,学习必看)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wang631106979/article/details/51737456

JAVA的安全结构

 摘 要:Java的安全结构——“沙盒”模型的4个组成部分:内建于Java虚拟机和语言的安全特性、类的载入结构、类文件校验器、安全管理器和JAVA API。  关键词:Java语言 安全性 沙盒结构 ...
  • wxyxl
  • wxyxl
  • 2001-05-05 01:53:00
  • 781

CAKeyframeAnimation实现抖动效果

// // ViewController.m #import "ViewController.h" // 角度转弧度 #define angle2Radion(angle) (angle / ...
  • github_26672553
  • github_26672553
  • 2016-04-08 20:25:20
  • 685

CAKeyframeAnimation

关键帧通过path和values,两者只用一个,设置了path之后values就没有用了; 默认平分时间:总时间/(帧数-1),还可以通过keyTimes各个关键帧用的时间0-1,要跟calcula...
  • baidu_32469997
  • baidu_32469997
  • 2016-05-30 14:15:52
  • 503

IOS-swift 动画02 CAKeyframeAnimation

CAKeyframeAnimation 关键帧动画关键帧动画 主要用于多步骤动画主要属性: keyPath : 要设置的属性 path : 路径 可用UIBezierPath duration : 动...
  • baodongsheng2011
  • baodongsheng2011
  • 2016-05-19 19:51:41
  • 779

CAKeyframeAnimation Demo

CABasicAnimation已经可以应付一些比较简单的应用场景了,比如view的平移出现、淡入淡出等。 但是在有些情况下直线的运动并不能满足我们的需要,因此有必要学习进阶版的核心动画,那就是...
  • DJH996064549
  • DJH996064549
  • 2016-02-22 13:53:52
  • 465

ios开发总结之 CAKeyframeAnimation

1.storyboard中加载一个view 2.demo示例1 /** (1)values属性 values属性指明整个动画过程中的关键帧点,需要注意的是,起点必须作为values的第一个...
  • sunnyboy9
  • sunnyboy9
  • 2016-04-30 10:55:17
  • 942

iOSCoreAnimation CAKeyFrameAnimation 详解

http://www.cnblogs.com/wengzilin/p/4256468.html 在上一篇专题文章【原】iOSCoreAnimation动画系列教程(一):CABasicA...
  • jeffasd
  • jeffasd
  • 2016-02-01 11:50:50
  • 355

CAKeyframeAnimation的简单使用

@interface MJViewController () @property (weak, nonatomic) IBOutlet UIView *redView; @en...
  • cupidsCat
  • cupidsCat
  • 2016-08-17 10:02:27
  • 131

<原>关键帧动画CAKeyframeAnimation

之所以叫做关键帧动画是因为,这个类可以实现,某一属性按照一串的数值进行动画,就好像制作动画的时候一帧一帧的制作一样。 一般使用的时候  首先通过 animationWithKeyPath 方法 创建...
  • huifeidexin_1
  • huifeidexin_1
  • 2013-01-15 09:09:33
  • 34223

CAKeyframeAnimation简单旋转动画

使用关键帧动画做的一个简单的动画,效果如下: 主要代码如下: _sunView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, ...
  • u014084081
  • u014084081
  • 2015-02-01 16:55:56
  • 2105
收藏助手
不良信息举报
您举报文章:iOS动画进阶 - CAKeyframeAnimation实现过山车动画
举报原因:
原因补充:

(最多只允许输入30个字)