如何使用CAAnimation制作曲线/圆弧动画?

2024-05-11

我有一个用户界面,其中一个项目被删除,我想模仿 iOS 邮件中的“移动到文件夹”效果。小字母图标被“扔”到文件夹中的效果。我的会被扔进垃圾箱。

我尝试使用它来实现它CAAnimation在图层上。据我在文档中阅读,我应该能够设置byValue and a toValue并且 CAAnimation 应该对值进行插值。我想要做一条小曲线,因此该项目会经过项目起始位置上方和左侧的一点。

    CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"position"];
[animation setDuration:2.0f];
[animation setRemovedOnCompletion:NO];
[animation setFillMode:kCAFillModeForwards];    
[animation setTimingFunction:[CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseOut]];
[animation setFromValue:[NSValue valueWithCGPoint:fromPoint]];
[animation setByValue:[NSValue valueWithCGPoint:byPoint]];
[animation setToValue:[NSValue valueWithCGPoint:CGPointMake(512.0f, 800.0f)]];
[animation setRepeatCount:1.0];

我对此研究了一段时间,但在我看来,Apple 意味着线性插值。 添加 byValue 不会计算出漂亮的弧线或曲线并通过它对项目进行动画处理。

我该如何去做这样的动画?

感谢您提供的任何帮助。


使用 UIBezierPath

(别忘了链接然后import QuartzCore,如果您使用的是 iOS 6 或更早版本)

示例代码

您可以使用遵循路径的动画,足够方便,CAKeyframeAnimation支持一个CGPath,可以从UIBezierPath。雨燕3

func animate(view : UIView, fromPoint start : CGPoint, toPoint end: CGPoint)
{
    // The animation
    let animation = CAKeyframeAnimation(keyPath: "position")

    // Animation's path
    let path = UIBezierPath()

    // Move the "cursor" to the start
    path.move(to: start)

    // Calculate the control points
    let c1 = CGPoint(x: start.x + 64, y: start.y)
    let c2 = CGPoint(x: end.x,        y: end.y - 128)

    // Draw a curve towards the end, using control points
    path.addCurve(to: end, controlPoint1: c1, controlPoint2: c2)

    // Use this path as the animation's path (casted to CGPath)
    animation.path = path.cgPath;

    // The other animations properties
    animation.fillMode              = kCAFillModeForwards
    animation.isRemovedOnCompletion = false
    animation.duration              = 1.0
    animation.timingFunction        = CAMediaTimingFunction(name:kCAMediaTimingFunctionEaseIn)

    // Apply it
    view.layer.add(animation, forKey:"trash")
}

了解 UIBezierPath

贝塞尔曲线路径(或贝塞尔曲线 http://en.wikipedia.org/wiki/B%C3%A9zier_curve,准确地说)的工作方式与您在 Photoshop、烟花、草图中找到的完全一样......它们有两个“控制点”,每个顶点一个。比如我刚刚制作的动画:

像这样工作贝塞尔路径。请参阅有关具体细节的文档 http://developer.apple.com/library/ios/#documentation/uikit/reference/UIBezierPath_class/Reference/Reference.html#//apple_ref/doc/uid/TP40009276-CH1-SW19,但基本上是两个点将弧线“拉”向某个方向。

绘制路径

一项很酷的功能UIBezierPath,你可以在屏幕上绘制它们CAShapeLayer,从而帮助您想象它将遵循的路径。

// Drawing the path
let *layer          = CAShapeLayer()
layer.path          = path.cgPath
layer.strokeColor   = UIColor.black.cgColor
layer.lineWidth     = 1.0
layer.fillColor     = nil

self.view.layer.addSublayer(layer)

改进原来的例子

计算你自己的贝塞尔曲线路径的想法是,你可以使完全动态,因此,动画可以根据多种因素改变它将要做的曲线,而不是像我在示例中所做的那样仅仅进行硬编码,例如例如,控制点可以计算如下:

// Calculate the control points
let factor : CGFloat = 0.5

let deltaX : CGFloat = end.x - start.x
let deltaY : CGFloat = end.y - start.y

let c1 = CGPoint(x: start.x + deltaX * factor, y: start.y)
let c2 = CGPoint(x: end.x                    , y: end.y - deltaY * factor)

最后一点代码使得点与上图类似,但相对于点形成的三角形而言,数量是可变的,乘以一个相当于“张力”值的因子。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用CAAnimation制作曲线/圆弧动画? 的相关文章

随机推荐

  • 当列的数据类型为 int 时,如何用字符串替换 null

    我有一个包含 3 列的表和如下示例数据 所有列都是数据类型int 我有这个查询 select foodid dayid from Schedule 我要更换dayid用字符串 ifdayid null 为此我尝试了这个查询 select f
  • Kotlin 协程阻塞 Android 中的主线程

    我是 Kotlin 和协程的新手 我有一个fun在我的活动及其内部 检查User用户名和密码 如果为真 则返回Users object 一切都好 但是当我按下按钮时 我的活动被阻止并等待响应Users login 我用这个有趣的 priva
  • 提高打字速度? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 最近我注意到我的打字技巧还有很多不足之处 我在大学里已经编程几年了 打字速度从来都不是很重要 类并不关注你可以输出多少代码 而是关注如何设计和实现代码
  • 无法分配给对象“#”的只读属性“detachedCallback”

    我安装了A Frame https github com aframevr aframe by npm install aframe save 当我使用时 import aframe or use require aframe import
  • 使用“回形针”gem 和 Ruby on Rails 3 时出现问题

    我在运行 Snow Leopard v1 6 5 的 MacO 上使用 Ruby on Rails 3 我想使用 回形针 gem 所以我将它包含在我的 Gemfile 中 如下所示 gem paperclip gt 2 3 然后 在终端中运
  • min-height 和 height 属性有什么区别? [复制]

    这个问题在这里已经有答案了 我查了一下这个问题 但无法理解它与我的具体问题的关系 我将有问题的 html 设置如下 div class container fluid div class inner div class weatherdat
  • 使用 NSCache 实现缓存过期

    我正在使用 NSCache 在我的应用程序中实现缓存 我想为其添加过期时间 以便在一段时间后它将获取新数据 有哪些选择以及最好的方法是什么 我应该查看访问缓存时的时间戳并使之无效吗 缓存是否应该通过使用固定间隔计时器自动使自身失效 缓存是否
  • adler32 校验和的可靠性如何?

    我想知道与例如相比 adler32 校验和有多可靠 md5 校验和 维基百科上说 adler32 比 md5 可靠得多 所以我想知道有多少 以及以何种方式 更具体地说 我想知道它是否足够可靠 作为对大小为 20GB 以上的 tar 文件的长
  • 如何在 Python for 循环中获取 GAE ndb 中当前记录的密钥?

    我目前有一个网页 其中显示数据存储中的记录列表以及编辑链接 我想从数据库转换它 至新开发银行 我是 Python 和 GAE 新手 当前代码 tbody for listtype in listtypes tr td listtype Li
  • 单击 div 中的图像时如何翻转该 Div?

    好吧 我对编写 Javascript 知之甚少 我可以对其进行一些编辑 并且涉足了 CSS3 动画 我将向您展示我正在努力实现的目标 然后在下面进行解释 网站布局将是这样的 https i stack imgur com RMb4R jpg
  • Buildozer Numpy RuntimeError:工具链损坏:无法链接简单的 C 程序

    用 Python 编写我的第一个 Android 应用程序并使用 Buildozer 对其进行打包 因为稍后在项目中需要使用numpy 所以我尝试打包以下测试代码 import numpy import kivy kivy require
  • keras 中的增量学习

    我正在寻找 scikit learn 的 keras 等效项partial fit https scikit learn org 0 15 modules scaling strategies html incremental learni
  • 改造添加带有令牌和 ID 的标头

    我在获取经过身份验证的用户时遇到问题 在此之前我得到了令牌和用户 ID 现在我需要使用访问令牌和 ID 从服务器获取用户 我有标题格式 https i stack imgur com OQ87Y png 现在我尝试使用拦截器添加带有用户令牌
  • strtok() 使用安全吗[重复]

    这个问题在这里已经有答案了 我读到了很多负面的东西strtok 有人说它已经过时 有人说它不是线程安全的 等等 那么真相是什么 我可以使用吗strtok 它是线程安全的吗 Note 我正在使用 Visual C 您可以使用它 它是标准库的一
  • 如何编写运行 Rails db:migrate 任务的 rake 任务?

    我想运行 db migrate VERSION 0 然后在我自己的 rake 任务中运行 db migrate 我对如何做到这一点感到困惑 我需要特殊的要求声明吗 我的 rake 任务将驻留在 Rails 应用程序的 lib tasks 目
  • $http.get 、 $http.post 、$http.put 、 $http.delete $http.head 和 $http.jsonp 之间的区别

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是 Angular JS 和 Web 开发的新手 请帮我 今天我读到了有关 Angular JS 中的 http 的内容 但我只知道
  • 禁用 VIM 中的警告?

    有没有办法禁用 VIM 中的警告 特别是 当文件从只读变为可写时 我想禁用警告 12 我有一个脚本可以打开文件进行编辑 但 vim 认为文件已更改并发出警告 Thanks 我的 vimrc 中有以下内容 你应该只需要第二个 它将消息回显到状
  • 温度转换 2 字节

    我很难转换两个字节的温度 我有一个控制单元 温度传感器 我可以在其中获取两个字节的温度消息 1 示例 message 40 25 LSBYTE 40 MSBYTE 25 0 03125 C bit temperature 25C seen
  • 如何通过覆盖 MSBuild 目标来防止外语资源生成?

    我正在致力于减少大型 C ASP NET 解决方案的编译时间 我们的解决方案使用通常的 resx 文件方法翻译成大约十几种外语 这些资源文件的解析和编译极大地减慢了我们的编译时间 并且是日常的挫败感 我知道可以创建自定义资源提供程序并摆脱
  • 如何使用CAAnimation制作曲线/圆弧动画?

    我有一个用户界面 其中一个项目被删除 我想模仿 iOS 邮件中的 移动到文件夹 效果 小字母图标被 扔 到文件夹中的效果 我的会被扔进垃圾箱 我尝试使用它来实现它CAAnimation在图层上 据我在文档中阅读 我应该能够设置byValue