[翻译] AnimatedPath 动画路径(持续更新)
AnimatedPath
动画路径
感谢原作者分享精神,有空补上使用教程
https://github.com/twotoasters/AnimatedPath
AnimatedPath explores using the CAMediaTiming
protocol to interactively control the drawing of a path.
AnimatedPath 尝试使用 CAMediaTiming 协议来控制绘制一条路径。
Basic usage
基本使用方法
Step 1: Draw a Path
第一步:绘制一条路径
- Tap around the screen to add points to a path. 点击屏幕来给路径添加点
- Drag existing points to move them. 拖动存在的点
- Tap and hold existing points to remove them. 长按着一个点来删除这个点
Step 2: Animate
第二步:动画
- The path is rendered using a
CAShapeLayer
withspeed == 0
. - The layer has an animation for its
strokeEnd
key path with afromValue
of 0 and atoValue
of 1. - Since the layer's
speed == 0
, adjusting the layer'stimeOffset
controls the time at which the animation is rendered. - The slider at the top of the screen adjusts the layer's
timeOffset
. - 使用 CAShapeLayer 来渲染路径,设置 speed = 0
- 这个 layer 用 strokeEnd 作为关键帧路径,其值从 0 到 1 变化
- 当 layer 的 speed 为0时,操作 layer 的 timeOffset 来控制时间,动画就是通过这个来渲染的
- 屏幕上方的 slider 控制器操作着 layer 的 timeOffset
Getting the Setup Right
如何正确的设置
The most difficult part of putting this example together was understanding how to add the animation to the layer and still be able to control the animation's progress via the timeOffset
. Here's what worked:
最难的部分就是怎么把动画加进 layer 中去,而且,还能够控通过 timeOffset 来控制动画的百分比进度,以下代码描述了怎么运作的:
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:NSStringFromSelector(@selector(strokeEnd))];
animation.fromValue = @0.0;
animation.toValue = @1.0;
animation.removedOnCompletion = NO;
animation.duration = kDuration;
[self.pathBuilderView.pathShapeView.shapeLayer addAnimation:animation forKey:NSStringFromSelector(@selector(strokeEnd))];
self.pathBuilderView.pathShapeView.shapeLayer.speed = 0;
self.pathBuilderView.pathShapeView.shapeLayer.timeOffset = 0.0;
[CATransaction flush];
self.pathBuilderView.pathShapeView.shapeLayer.timeOffset = kInitialTimeOffset;
The end result of this approach is that the animation has a beginTime
of 0 and the shape layer renders it at time kInitialTimeOffset
.
结果呢,就是动画有一个 beginTime,从 0 开始,然后,shapelayer 就根据 kInitialTimeOffset 来渲染。
The [CATransaction flush]
is required because it forces the system to give the animation added to the layer a beginTime
. The animation's beginTime
is calculated by adding its initial value (its value before being added to the layer) to the layer's current time. This is why the layer's timeOffset
must be set to 0 rather thankInitialTimeOffset
when the animation is added. Otherwise, the animation's beginTime
will have already taken kInitialTimeOffset
into account such that the animation is added to the time range(kInitialTimeOffset, kInitialTimeOffset + kDuration)
instead of (0, kDuration)
.
这个方法 [CATransaction flush] 是必须的,因为,他能够强制的让系统给添加了动画的 layer 一个 beginTime 。这个动画的 beginTime 是添加了 layer 的起始值,这就是为什么 layer 的 timeOffset 必须设置成 0 ,而不是 kInitalTimeOffset。所以,这个动画的 beginTime 会考虑到 kInitialTimeOffset ,然后他的时间就被设置成了 (kIntialTimeOffset, kInitialTimeOffset + kDuration), 而不是 (0, kDuration)【能力有限,此段翻译不准,见谅】
More Info
- This example was inspired by Controlling Animation Timing by David Rnnqvist
- Apple's Timing, Timespaces, and CAAnimation is a helpful resource.
- 这个例子的灵感来自于 Controlling Animation Timing by David Rnnqvist
- 苹果的 Timing, Timespaces, and CAAnimation 也很管用
[翻译] AnimatedPath 动画路径(持续更新)的更多相关文章
- iOS动画相关(持续更新)
1.When my application is entering background, because the user push the home button, the animations ...
- 《Entity Framework 6 Recipes》中文翻译系列 目录篇 -持续更新
为了方便大家的阅读和学习,也是响应网友的建议,在这里为这个系列做一个目录.在目录开始这前,我先来回答之前遇到的几个问题. 1.为什么要学习EF? 这个问题很简单,项目需要.这不像学校,没人强迫你学习! ...
- BAT 前端开发面经 —— 吐血总结 前端相关片段整理——持续更新 前端基础精简总结 Web Storage You don't know js
BAT 前端开发面经 —— 吐血总结 目录 1. Tencent 2. 阿里 3. 百度 更好阅读,请移步这里 聊之前 最近暑期实习招聘已经开始,个人目前参加了阿里的内推及腾讯和百度的实习生招聘, ...
- Android 常用开源库总结(持续更新)
前言 收集了一些比较常见的开源库,特此记录(已收录350+).另外,本文将持续更新,大家有关于Android 优秀的开源库,也可以在下面留言. 一 .基本控件 TextView HTextView 一 ...
- 【持续更新】JavaScript常见面试题整理
[重点提前说]这篇博客里的问题涉及到了了JS中常见的的基础知识点,也是面试中常见的一些问题,建议初入职场的园友Mark收藏,本文会持续更新~ 1. 引入JS的三种方式 1.在HTML标签中直接使用,直 ...
- 【前端】Util.js-ES6实现的常用100多个javaScript简短函数封装合集(持续更新中)
Util.js (持续更新中...) 项目地址: https://github.com/dragonir/Util.js 项目描述 Util.js 是对常用函数的封装,方便在实际项目中使用,主要内容包 ...
- android 量产软件改动信息(持续更新)
http://blog.csdn.net/xubin341719/article/details/8449352 关键词:android 4.0默认语言蓝牙名称 MTP名称默认时区关于平板电脑 内核版 ...
- Python常用组件、命令大总结(持续更新)
Python开发常用组件.命令(干货) 持续更新中-关注公众号"轻松学编程"了解更多. 1.生成6位数字随机验证码 import random import string def ...
- JVM面试题(史上最强、持续更新、吐血推荐)
文章很长而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三部 ...
随机推荐
- CF 577A 分解因数
输入一个n 构成一个n*n的表 这个表里的数 第i行j列的值为i*j 问x在这个表里出现了几次 Sample test(s)input10 5output2input6 12output4input5 ...
- 提高eclipse使用效率(一)--使用快捷键
编辑代码常用快捷键 格式化代码的快捷键 Ctrl + Shift + F 格式化缩进的快捷键是 Ctrl + I,只能对选中的文本进行缩进 删除一行的快捷键是 Ctrl + D 当前窗口最大化最小化切 ...
- 【LOJ】#2537. 「PKUWC2018」Minimax
题解 加法没写取模然后gg了QwQ,de了半天 思想还是比较自然的,线段树合并的维护方法我是真的很少写,然后没想到 很显然,我们有个很愉快的想法是,对于每个节点枚举它所有的叶子节点,对于一个叶子节点的 ...
- umount /dev/shm
[root@test ~]# umount /dev/shm umount: /dev/shm: device is busy. (In some cases useful info a ...
- IOS 本地推送
// 1.打开本地推送并设置属性 NSString *str = @"本地推送的信息"; UIApplication *app = [UIApplication sharedApp ...
- eschop购物实现立即购买和加入购物车
后台=>平台=>商店设置=>购物流程 是否一步购物设置为否 2:修改代码 .js/common.js function addToCartShowDivResponse(result ...
- JQuery实现最字体的放大缩小
网页常常有对字体放大缩小的需求,我们不妨来看一下下面这段JQuery代码的实现. 假如在html页面代码中我们有这么一段代码: <p>啦啦啦啦啦啦啦啦啦啦</p> 那么JQue ...
- Tensorflow学习:(二)搭建神经网络
一.神经网络的实现过程 1.准备数据集,提取特征,作为输入喂给神经网络 2.搭建神经网络结构,从输入到输出 3.大量特征数据喂给 NN,迭代优化 NN 参数 4.使 ...
- sql find duplicate
SELECT GUID, COUNT(*) FROM xx GROUP BY GUID HAVING COUNT(*) > 1; SELECT name, email, COUNT(*) FRO ...
- BZOJ.3611.[HEOI2014]大工程(虚树 树形DP)
题目链接 要求的和.最大值.最小值好像都可以通过O(n)的树形DP做,总询问点数<=2n. 于是建虚树就可以了.具体DP见DP()函数,维护三个值sum[],mx[],mn[]. sum[]要开 ...