UIBezierPath + CAShapeLayer - 动画填充一个圆圈[重复]

2023-12-06

我正在尝试对 CAShapeLayer 的路径进行动画处理,以便获得圆形“填充”到特定数量的效果。

问题

它“有效”,但不是AS尽管我认为它可能很顺利,但我想对其进行一些缓和。但因为我正在单独为每个 % 设置动画,所以我不确定现在是否可行。所以我正在寻找可以解决这个问题的替代方案!

视觉解释

首先——这里是我试图实现的动画的一些“帧”(参见图像——圆圈填充从 0% 到 25%)

enter image description here enter image description here enter image description here enter image description here enter image description here

Code

我创建绿色描边(外部):

let ovalPath = UIBezierPath(ovalInRect: CGRectMake(20, 20, 240, 240))
let circleStrokeLayer = CAShapeLayer()
circleStrokeLayer.path = ovalPath.CGPath
circleStrokeLayer.lineWidth = 20
circleStrokeLayer.fillColor = UIColor.clearColor().CGColor
circleStrokeLayer.strokeColor = colorGreen.CGColor

containerView.layer.addSublayer(circleStrokeLayer)

我创建填充形状的初始路径(内部):

let filledPathStart = UIBezierPath(arcCenter: CGPoint(x: 140, y: 140), radius: 120, startAngle: startAngle, endAngle: Math().percentToRadians(0), clockwise: true)
filledPathStart.addLineToPoint(CGPoint(x: 140, y: 140))
filledLayer = CAShapeLayer()
filledLayer.path = filledPathStart.CGPath
filledLayer.fillColor = colorGreen.CGColor
containerView.layer.addSublayer(filledLayer)

然后,我使用 for 循环和 CABasicAnimations 数组来制作动画。

var animations: [CABasicAnimation] = [CABasicAnimation]()

func animate() {

    for val in 0...25 {
        let morph = CABasicAnimation(keyPath: "path")
        morph.duration = 0.01
        let filledPathEnd = UIBezierPath(arcCenter: CGPoint(x: 140, y: 140), radius: 120, startAngle: startAngle, endAngle: Math().percentToRadians(CGFloat(val)), clockwise: true)
        filledPathEnd.addLineToPoint(CGPoint(x: 140, y: 140))

        morph.delegate = self
        morph.toValue = filledPathEnd.CGPath
        animations.append(morph)
    }

    applyNextAnimation()
}

func applyNextAnimation() {

    if animations.count == 0 {
        return
    }

    let nextAnimation = animations[0]
    animations.removeAtIndex(0)
    filledLayer.addAnimation(nextAnimation, forKey: nil)
}

override func animationDidStop(anim: CAAnimation, finished flag: Bool) {
    filledLayer.path = (anim as! CABasicAnimation).toValue as! CGPath
    applyNextAnimation()
}

不要尝试创建一大堆单独的动画。 CAShapeLayer 有一个描边开始和描边结束属性。动画that.

技巧是在形状图层中安装整个圆的弧,然后创建一个 CABasicAnimation,将 shapeEnd 从 0 动画到 1(将填充动画从 0% 动画到 100%)或任何您需要的值。

您可以在该动画上应用您想要的任何时间。

我在 Github 上有一个项目(恐怕是 Objective-C 的项目),其中包含使用这种技术的“时钟擦除”动画。它看起来是这样的:

Clock Wipe animation

(这是一个gif,看起来有点粗糙。实际的iOS动画是相当流畅的。)

链接如下。在自述文件中查找“时钟擦除”动画。

iOS-CAAnimation-group-demo

时钟擦除动画将形状图层安装为图像视图图层上的蒙版。如果您想要这样做,您可以直接绘制形状图层。

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

UIBezierPath + CAShapeLayer - 动画填充一个圆圈[重复] 的相关文章

随机推荐

  • 用户在 Windows Phone 8 上的 RichTextBox 中选择文本

    我正在尝试在 Windows Phone 8 应用程序中使用 RichTextBox 用户需要能够选择文本并将其复制到剪贴板 用户不需要编辑文本 只需选择它 但是 我似乎无法在 Windows Phone 模拟器或 Windows Phon
  • 将数据绑定到 DropDownList MVC Razor

    我刚刚开始使用 MVC 和 Razor 的项目 现在 在将来自数据库的数据绑定到下拉列表时遇到问题 请参考我下面的代码 专业化模式 public class SpecializationModel Display Name Speciali
  • 带有 JSTL 的 JSP 无法在 Spring Boot 应用程序中的 tomcat 8 上运行

    我已将这些依赖项包含在 pom xml 中
  • 通过触发器更新值 AFTER UPDATE Oracle 11g

    我正在开发一个小型图书馆数据库 我不想允许某人更新某人的 ID 但我需要使用 AFTER UPDATE 和 FOR EACH STATEMENT 据我所知这是 Oracle 的默认设置 因此 基本上 如果有人更新客户信息并更改他 她的 ID
  • 创建六个具有相同渲染、不同数据的图表(highchart)

    我需要帮助 我需要使用 ajax 调用 jquery 创建六个具有相同渲染但每个图表中具有不同数据和图表标题的图表 我该怎么做 http www highcharts com documentation how to use live ch
  • 在 R 中为 LM 模型创建变量列表循环

    我正在尝试从变量组合列表创建多个线性回归模型 如果更有用的话 我也将它们单独作为数据框 变量列表如下所示 Vars x1 x2 x3 x1 x2 x4 x1 x2 x5 x1 x2 x6 x1 x2 x7 我正在使用的循环如下所示 for
  • 有没有办法忽略单个 FindBugs 警告?

    使用 PMD 如果您想忽略特定警告 可以使用 NOPMD忽略该行 FindBugs 有类似的东西吗 FindBugs 最初的方法涉及 XML 配置文件 又名filters 这确实不如 PMD 解决方案方便 但 FindBugs 适用于字节码
  • 如何使用快速排序在列表列表中按索引排序

    我正在尝试使用快速排序对索引 1 处的列表列表进行排序 例如 list 2 5 3 2 4 9 0 9 1 1 1 1 4 7 5 我希望能够做到这一点 按索引 1 排序 quickSort list output list 1 1 1 2
  • PHP邮件/PEAR邮件

    在我的目录网站上 我有 发送电子邮件 功能 这允许用户向公司提交查询 此查询的副本也会发送到我的收件箱 几个月前 我注意到我的收件箱不再收到电子邮件副本 所以我对此进行了调查 结果发现我的网络主机不再允许使用 PHP 邮件功能发送外部电子邮
  • 创建新索引时统计信息是否会自动更新?

    创建索引后运行更新统计信息有什么好处吗 或者它会自动为您完成吗 如果新索引需要新的统计信息 它们会自动创建 除非您通过以下方式明确禁用新索引的统计信息计算CREATE INDEX WITH STATISTICS NORECOMPUTE ON
  • 下一个兄弟组合器不应该与复杂的选择器一起使用

    TL DR 根据规范 以下内容不应该起作用 但它确实起作用 a b b margin top 20px Details 根据规格 下一个同级组合器 或 相邻同级组合器 应该仅适用于 简单选择器序列 其本身已定义 as 不被组合器分隔的一系列
  • Objective-C 委托类型

    在 Objective C 中创建委托时 假设委托 id
  • 如何从 Google Apps 脚本发出 Gmail API 批量请求?

    例如 我需要在以下场景中进行批量请求 使用后Gmail Users Threads list 我想做几个Gmail Users Threads get threadId 批量操作 我正在谈论类似的事情gapi client newBatch
  • Xcode:Interface Builder XIB 编译器错误

    Xcode 5 1 1 和 OS X 10 9 3 我打开 Xcode 并启动一个新的 Cocoa 项目 然后我点击运行 构建失败 我收到以下错误消息 Interface Builder XIB Compiler Error Interfa
  • if else 语句反转

    我想要的结果是第二个 if else 语句 如果代码不在列表中 则发出警报 我不明白为什么第一个 if else 语句失败 我认为只需反转第二个 if else 语句 我误解了什么吗 https jsfiddle net e6qohvhc
  • 如果值比闭包寿命更长,那么在闭包之间共享引用的正确方法是什么?

    我想分享两个闭包之间的引用 在一个闭包中可变地 这是一种人为的情况 但我发现在学习 Rust 的背景下它很有趣 为了使它工作 我必须利用Rc Weak and RefCell 有没有更简单的方法来实现这一目标 use std cell Re
  • 多个 和 标签

    我正在尝试创建一个非常简单的 Web 应用程序 基本上是为了了解 HTML5 CSS 和 JavaScript 编码的最佳实践 我的应用程序有 3 4 页 每一页都使用相同的菜单标题 所以我想通过将其写入单独的文件 PHP 或 HTML 来
  • get_headers 不一致[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 运行以下代码 var dump get headers
  • 在 Makefile 中链接 cURL

    通过源代码安装 cURL 后 我需要在 Ubuntu 11 04 中链接 cURL 问题的修正 首先我发现 l必须先于 L然后发现我没有在 makefile 中输入变量 获取 cURL 配置 在我的终端上 curl config libs
  • UIBezierPath + CAShapeLayer - 动画填充一个圆圈[重复]

    这个问题在这里已经有答案了 我正在尝试对 CAShapeLayer 的路径进行动画处理 以便获得圆形 填充 到特定数量的效果 问题 它 有效 但不是AS尽管我认为它可能很顺利 但我想对其进行一些缓和 但因为我正在单独为每个 设置动画 所以我