干货系列之手把手教你使用Core animation 做动画
来源:互联网 发布:淘宝客服打字要多快 编辑:程序博客网 时间:2024/06/05 05:37
转载于http://ios.jobbole.com/84329/
源码下载:源码
最近在技术群里,有人发了一张带有动画效果的图片。觉得很有意思,便动手实现了一下。在这篇文章中你将会学到Core Animation显式动画中的关键帧动画、组合动画、CABasicAnimation动画。先上一张原图的动画效果。
点击此查看原图动画效果。
本文要实现的效果图如下:
把原动画gif动画在mac上使用图片浏览模式打开,我们可以看到动画每一帧的显示。从每一帧上的展示过程,可以把整体的动画进行拆分成两大部分。
第一部分(Part1)从初始状态变成取消状态(图片上是由横实线变成上线横线交叉的圆)。
第二部分(Part2)从取消状态变回初始状态。
下面我们先详细分析Part1是怎么实现的。根据动画图,把Part1再细分成三步。
Step1 : 中间横实线的由右向左的运动效果。这其实是一个组合动画。是先向左偏移的同时横线变短。先看一下实现的动态效果。
■ 向左偏移—使用基本动画中animationWithKeyPath
键值对的方式来改变动画的值。我们这里使用position.x
,同样可以使用transform.translation.x
来平移。
■ 改变横线的大小—使用经典的strokeStart
和strokeEnd
。其实上横线长度的变化的由strokeStart
到strokeEnd
之间的值来共同来决定。改变strokeEnd
的值由1.0到0.4,不改变strokeStart
的值。横线的长度会从右侧方向由1.0倍长度减少到0.4倍长度。参见示意图的红色区域。
Step2 : 由左向右的动画–向右偏移同时横线长度变长。看一下Step2要实现的动画效果。其思路和Step1是一样的。
Step3: 圆弧的动画效果和上下两个横实线的动画效果。
- 画圆弧,首先想到是使用
UIBezierPath
。画个示意图来分析动画路径。示意图如下:
整个path路径是由三部分组成,ABC曲线
、CD圆弧
、DD′圆
。
使用UIBezierPath
的方法
把三部分路径关联起来。详细讲解思路。
• ABC曲线
就是贝塞尔曲线,可以根据A、B、C三点的位置使用方法
二次贝塞尔曲线示意图如下:
其中control point 点是从曲线上取 start point和end point 切点相交汇的所得到的交点。如下图:
首先C点取圆上的一点,-30°。那么,
C点坐标为:
A点坐标为:
control point 为E点:
• CD圆弧
的路径使用此方法确定
关于弧度问题,UIBezierPath的官方文档中的这张图:
StartAngle 弧度即C点弧度,EndAngel弧度即D点弧度。
• DD′圆
的路径和上面2一样的方法确定。
StartAngle 弧度即D点弧度,EndAngel弧度即D′点弧度。
下面部分代码是所有path路径。
Path路径有了,接着实现动画效果。
圆弧的长度逐渐变长。我们还是使用经典的strokeStart
和strokeEnd
。但是圆弧是如何变长的呢?
(1) 初始圆弧有一段长度。
(2) 在原始长度的基础上逐渐变长,逐渐远离A点,同时要在D点停止。
(3) 长度逐渐变长,最终要在D与D′点交汇。
我们分别解决这个三个问题。
第一个问题,strokeEnd - strokeStart > 0
这样能保证有一段圆弧。
第二个问题,逐渐变长,意味着strokeEnd
值不断变大。远离A点意味着strokeStart
的值不断变大。在D点停止,说明了strokeStart
有上限值。
第三个问题,意味着strokeEnd
值不断变大,最终值为1.0。
这三个问题说明了一个问题,strokeEnd
和strokeStart
是一组变化的数据。
那么core animation 中可以控制一组值的动画是关键帧动画(CAKeyframeAnimation
)。
为了更准确的给出strokeEnd
和strokeStart
值,我们使用长度比
来确定。
假设我们初始的长度就是曲线ABC的长度。但是贝塞尔曲线长度怎么计算?使用下面方法:
计算贝塞尔曲线所在的比例为:
初始的strokeStart = 0
、strokeEnd = orignPercent
。
最终的stokeStart = ?
实现动画的代码为
效果图为:
2.上下横线的动画效果。
此动画效果,需要使用transform.rotation.z
转动角度。
上横线转动的角度顺序为 0 -> 10° -> (-55°) -> (-45°)
这是一组数据,使用关键帧处理动画。
下横线转动的角度顺序为0 -> (-10°) -> (55°) -> (45°)
你认为这么就结束了? 最终结束的动画如下:
发现相交的直线没有居中,而是靠左显示。
向左平移,使用transform.translation.x
即旋转角度又发生偏移量,使用组合动画。
上横线组合动画
下横线组合动画
Part1到此结束。最终效果图
Part2的思路和Part1思路是一样的。你可以参考代码自己思考一下。核心代码
最终效果图:
本篇文章讲解结束!
代码点此链接下载:https://github.com/WZF-Fei/ZFChangeAnimation
- 干货系列之手把手教你使用Core animation 做动画
- 干货系列之手把手教你使用Core animation 做动画
- 手把手教你使用Core animation 做动画(上)
- Unity教程之手把手教你实现动画Animation
- 【前沿干货】手把手教你做网站!
- 手把手系列之四十八—手把手教你做寿司
- 核心动画Core Animation系列之概述和CABasicAnimation
- 手把手系列之二——手把手教你做春卷
- 手把手系列之四——手把手教你做蓝莓芝士蛋糕
- 手把手系列之六——手把手教你做草莓酒
- 手把手系列之七——手把手教你做清凉的椰汁红豆糕
- 手把手系列之八——手把手教你做叉烧肉
- 手把手系列之十一——手把手教你做红烧肉
- 手把手系列之十——手把手教你做话梅鸡翅
- 手把手系列之十二——手把手教你做美味的薰衣草饼干
- 手把手系列之十四——手把手教你做迷你小pizza
- 手把手系列之十五——手把手教你做美味酸菜鱼(超级罗嗦版)
- 手把手系列之十八——手把手教你做KFC黄金蝴蝶虾
- 网址收藏
- 关于按钮设置属性的小细节
- Android 6.0 使用蓝牙BLE 时 报错:java.lang.SecurityException:Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOC
- makefile常用参数
- 把字符串转换为对应的整数
- 干货系列之手把手教你使用Core animation 做动画
- 《HTML5移动开发指南》——笔记8(Geolocation地理定位)
- 常用js操作
- 浅析软件测试用例的优先级
- React 移动 web 极致优化
- Hbase实战一:安装配置
- oracle 多表查询,子查询,集合运算,分页查询
- 【安卓开发】Facebook工程师是如何改进他们Android客户端的
- css实现翻转卡片效果