- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这是对我昨天提出的问题的补充。结果完美,但我想要修改。 Using drawRect to draw & animate two graphs. A background graph, and a foreground graph
下面的代码基于上面的线程,生成了一个 CABasicAnimation 来生成深蓝色“三角形”。我希望它不是深蓝色纯色,而是具有 3 个色标的 CAGradientLayer:红/绿/蓝。
我尝试添加一个 CAGradientLayer 来配置渐变,然后使用 addSubLayer 将渐变添加到动画出来的 CAShapeLayer。我在下面发布的结果没有动画。颜色和形状保持不变。渐变看起来不错,只需要它动画出来:
import UIKit
import QuartzCore
import XCPlayground
let view = UIView(frame: CGRect(x: 0, y: 0, width: 521, height: 40))
view.backgroundColor = UIColor.whiteColor()
XCPlaygroundPage.currentPage.liveView = view
let maskPath = UIBezierPath()
maskPath.moveToPoint(CGPoint(x: 0, y: 30))
maskPath.addLineToPoint(CGPoint(x: 0, y: 25))
maskPath.addLineToPoint(CGPoint(x: 300, y: 10))
maskPath.addLineToPoint(CGPoint(x: 300, y: 30))
maskPath.closePath()
let maskLayer = CAShapeLayer()
maskLayer.path = maskPath.CGPath
maskLayer.fillColor = UIColor.whiteColor().CGColor
let rectToAnimateFrom = UIBezierPath(rect: CGRect(x: 0, y: 0, width: 0, height: 40))
let rectToAnimateTo = UIBezierPath(rect: CGRect(x: 0, y: 0, width: 97, height: 40))
let backgroundGray = CAShapeLayer()
backgroundGray.path = maskPath.CGPath
backgroundGray.fillColor = UIColor.grayColor().CGColor
let foregroundGradient = CAShapeLayer()
foregroundGradient.mask = maskLayer
foregroundGradient.backgroundColor = UIColor.clearColor().CGColor
let gradientLayer = CAGradientLayer()
gradientLayer.startPoint = CGPointMake(0, 0)
gradientLayer.endPoint = CGPointMake(1, 0)
gradientLayer.frame = maskPath.bounds
let colors = [UIColor.redColor().CGColor, UIColor.greenColor().CGColor, UIColor.blueColor().CGColor]
gradientLayer.colors = colors
foregroundGradient.addSublayer(gradientLayer)
view.layer.addSublayer(backgroundGray)
view.layer.addSublayer(foregroundGradient)
let animation = CABasicAnimation(keyPath: "path")
animation.fromValue = rectToAnimateFrom.CGPath
animation.toValue = rectToAnimateTo.CGPath
animation.duration = 2
animation.removedOnCompletion = false
animation.fillMode = kCAFillModeForwards
foregroundGradient.addAnimation(animation, forKey: nil)
我需要 foregroundGradient 对象(带有 gradientLayer 子层!)从左到右设置动画。
如果您从我上面的代码中删除渐变,并将 foregroundGradient 保留为纯色,您将看到动画效果。
最佳答案
我认为您必须在您的 View 中使用您的掩码
,如下所述。
//Remove below line
view.layer.addSublayer(backgroundGray)
//Add your mask to view
view.layer.mask = backgroundGray
整个函数如下所示:
func getGradientView() {
let view = UIView(frame: CGRect(x: 0, y: 50, width: 521, height: 40))
view.backgroundColor = UIColor.grayColor()
self.view.addSubview(view)
let maskPath = UIBezierPath()
maskPath.moveToPoint(CGPoint(x: 0, y: 30))
maskPath.addLineToPoint(CGPoint(x: 0, y: 25))
maskPath.addLineToPoint(CGPoint(x: 300, y: 10))
maskPath.addLineToPoint(CGPoint(x: 300, y: 30))
maskPath.closePath()
let maskLayer = CAShapeLayer()
maskLayer.path = maskPath.CGPath
maskLayer.fillColor = UIColor.whiteColor().CGColor
let rectToAnimateFrom = UIBezierPath(rect: CGRect(x: 0, y: 0, width: 0, height: 40))
let rectToAnimateTo = UIBezierPath(rect: CGRect(x: 0, y: 0, width: 300, height: 40))
let backgroundGray = CAShapeLayer()
backgroundGray.path = maskPath.CGPath
backgroundGray.fillColor = UIColor.grayColor().CGColor
let foregroundGradient = CAShapeLayer()
foregroundGradient.mask = maskLayer
foregroundGradient.backgroundColor = UIColor.clearColor().CGColor
let gradientLayer = CAGradientLayer()
gradientLayer.startPoint = CGPointMake(0, 0)
gradientLayer.endPoint = CGPointMake(1, 0)
gradientLayer.frame = maskPath.bounds
let colors = [UIColor.redColor().CGColor, UIColor.greenColor().CGColor, UIColor.blueColor().CGColor]
gradientLayer.colors = colors
foregroundGradient.addSublayer(gradientLayer)
//Remove below line
//view.layer.addSublayer(backgroundGray)
view.layer.addSublayer(foregroundGradient)
//Add you mask to view
view.layer.mask = backgroundGray
let animation = CABasicAnimation(keyPath: "path")
animation.fromValue = rectToAnimateFrom.CGPath
animation.toValue = rectToAnimateTo.CGPath
animation.duration = 1
animation.repeatCount = 1000
animation.removedOnCompletion = false
animation.fillMode = kCAFillModeForwards
maskLayer.addAnimation(animation, forKey: "fill animation")
}
如果它按照您的异常(exception)情况工作,请告诉我。
关于ios - 动画 CAShapeLayer/CAGradientLayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39462304/
在 Swift 中,我有两个半透明圆圈,它们都是 CAShapeLayer。由于它们是半透明的,因此它们之间的任何重叠都变得可见,如下所示: 相反,我希望它们在视觉上“合并”在一起。我尝试过的解决方案
我注意到大多数人在初始化 CAShapeLayer 时使用: CAShapeLayer *shapeLayer = [CAShapeLayer layer]; 而不是使用初始化器: CAShapeLa
我有一个 CAShapeLayer,它必须在用户手指的引导下完成在屏幕上移动的简单任务。 问题是 Action 太慢了。图层确实移动了,但有延迟,感觉很慢。 我有另一个测试应用程序,其中 UIImag
有人有将渐变应用于 CAShapeLayer 的经验吗? CAShapeLayer 是一个很棒的图层类,但它似乎只支持纯色填充着色,而我希望它具有渐变填充(实际上是一个可设置动画的渐变)。 与 CAS
我正在使用核心动画层制作“行进的 Ant ”选择框架,如本文所示:MARCHING ANTS WITH CORE ANIMATION 。但我唯一不喜欢的是 CAShapeLayer 中的线宽。我需要宽
我目前正在使用 CAShapeLayer对于我的要求之一。我成功地实现了 fillcolor、strokecolor 等...但是我想更改该 CAShapeLayer 外部的颜色。我尝试用 backg
使用该代码,我从第一次触摸(触摸开始)和最后一次触摸(触摸结束)创建一行。但为了使这个形状动态(调整大小和移动),我需要在触摸它时选择它。我怎样才能做到这一点? shape.opacity =
我一直在尝试向我的 View 和按钮添加一个图层,但不知何故该图层根本没有出现。我错过了什么? class ViewController: UIViewController { var but
我正在尝试在嵌套在 UIView 层中的 CAShapeLayer 内渲染静态图像。形状的所有装饰(即边框、颜色、路径等)都会在 View 中正确渲染。 但是,为CALayer.contents属性提
我尝试在 UIImageView 中居中 CAShapeLayer 但没有成功,我找到了解决方案,将其(CAShapeLayer)添加到 UIVIew,然后将 UIVIew 添加到 ImageView
我正在为 CAShapeLayer 的结束笔画设置动画,但位置不正确,我无法弄清楚我做错了什么。框架是正确的,但是当我尝试调整位置时,我无法让它“填充” View 框架的宽度。我试图调整 _maskL
我正在尝试相对于特定 anchor 旋转 CAShapeLayer。但是当我申请firstLayer.transform = CATransform3DMakeRotation(CGFloat(M_2
我有一个简单的循环进度 View ,当下载文件时该 View 会被填充。大多数时候它会按预期工作,但有时它会“重置” - 它会填充到某个部分,通常填充到 100% 之前的最后一部分,然后突然变为 0%
我的 UIView 子类中有以下代码的三个变体。 局部变量 - (void)setupLayer { CAShapeLayer *faucet = [CAShapeLayer layer];
我正在使用 UIPickerView,它从具有十六进制颜色代码列表的数组中读取,然后用于用所有不同的颜色填充选择器 View 的每一行。我正在使用一种将十六进制代码转换为 RGB 代码的方法,以及一个
我在屏幕上总共画了 21 条线作为测量工具。这些线条在 UIViewController.view 上绘制为图层。我正在尝试按如下方式删除这些行。 NSLog 声明确认我得到了我正在寻找的所有 21
我正在开发 iPhone 应用程序,我使用下一个代码来圆我层的两个角: CAShapeLayer *backgroundMaskLayer = [CAShapeLayer layer]; UIBezi
我正在尝试围绕其中心点旋转 CAShapeLayer。我对边界、框架、 anchor 和中心点感到非常困惑。 我在 UIView 中创建了一个圆形 CAShape,并希望围绕其中心旋转它。我只包含了部
我正在尝试创建一个动画,其中两条线在用户拖动 UIView 时淡出并在用户释放拖动时淡入。 因此,我有两个函数 undrawLines(在平移手势开始时调用)和 redrawLines(在平移手势结束
我想知道为什么当我尝试使用基本动画为 CAShapeLayer 的 path 属性设置动画时它可以工作,但当我尝试使用事务来执行此操作时却不起作用。 我已经使用事务成功地为其他 animatable
我是一名优秀的程序员,十分优秀!