10.2 自定义缓冲函数.pdfVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
10.2 自定义缓冲函数

10.2 ⾃定义缓冲函数 ⾃定义缓冲函数 在第⼋章中,我们给时钟项⽬添加了动画。看起来很赞,但是如果有合适 缓冲函数 就更好了。在显⽰世界中,钟表指针转动 时候,通常起步很慢,然后迅速啪地⼀ 声,最后缓冲到终点。但是标准 缓冲函数在这⾥每⼀个适合它,那该如何创建⼀个 新 呢? 除了+functionWithName:之外,CAMediaTimingFunction同样有另⼀个构造 函数,⼀个有四个浮点参数 +functionWithControlPoints:::: (注意这⾥奇 怪 语法,并没有包含具体每个参数 名称,这在objective-C 中是合法 ,但是却违 反了苹果对⽅法命名 指导⽅针,⽽且看起来是⼀个奇怪 设计)。 使⽤这个⽅法,我们可以创建⼀个⾃定义 缓冲函数,来匹配我们 时钟动画,为了 理解如何使⽤这个⽅法,我们要了解⼀些CAMediaTimingFunction是如何⼯作 。 三次贝塞尔曲线 CAMediaTimingFunction函数 主要原则在于它把输⼊ 时间转换成起点和终点 之间成⽐例 改变。我们可以⽤⼀个简单 图标来解释,横轴代表时间,纵轴代表改 变 量,于是线性 缓冲就是⼀条从起点开始 简单 斜线 (图10 .1)。 图10 .2 三次贝塞尔缓冲函数 实际上它是⼀个很奇怪 函数,先加速,然后减速,最后快到达终点 时候又加速, 那么标准 缓冲函数又该如何⽤图像来表⽰呢? CAMediaTimingFunction有⼀个叫做-getControlPointAtIndex :values: ⽅法,可以⽤来检索曲线 点,这个⽅法 设计 确有点奇怪 (或许也就只有苹果能 回答为什么不简单返回⼀个CGPoint),但是使⽤它我们可以找到标准缓冲函数 点,然后⽤ IBezierPath和CAShapeLayer来把它画出来。 曲线 起始和终点始终是{0 , 0}和{1, 1} ,于是我们只需要检索曲线 第⼆个和第三个 点 (控制点)。具体代码见清单10 .4 。所有 标准缓冲函数 图像见图10 .3 。 清单10 .4 使⽤ IBezierPath绘制CAMediaTimingFunction @interface ViewController () @property (nonatomic, weak) IBOutlet IView *layerView ; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //create timing function CAMediaTimingFunction *function = [CAMediaTimingFunction funct //get control points CGPoint controlPoint1, controlPoint2; [function getControlPointAtIndex :1 values:(float *)controlPoi [function getControlPointAtIndex :2 values:(float *)controlPoi //create curve IBezierPath *path = [[ IBezierPath alloc] init]; [path moveToPoint:CGPointZero]; [path addCurveToPoint:CGPointMake(1, 1) controlPoint1:controlPoint1 controlPoint2:controlPoint //scale the path up to a reasonable size for display [path applyTransform:CGAffineTransformMakeScale(200, 200)]; //create shape layer CAShapeLayer *shapeLayer = [CAShapeLayer layer]; shapeLayer.strokeColor = [ IColor redColor].CGColor; shapeLayer.fillColor = [ IColor clearColor].CGCol

文档评论(0)

rovend + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档