为什么我不能将图层子图层的路径作为 CAAnimationGroup 的一部分进行动画处理,但我可以为组中的其他属性设置动画?

问题描述

感谢@matt,我不久前了解到可以在 lateinit var searchArgument: String override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? { // Inflate the layout for this fragment val root = inflater.inflate(R.layout.fragment_search,container,false) searchArgument = activity?.intent?.extras?.getString("searchArgument").toString() Log.d("eeee",searchArgument) // retuning null in Logcat return root } 中为多个图层的属性设置动画。诀窍是为子层添加名称

有关该技术的讨论,请参阅 Matt 在 this thread 中的回答,以及我编写的用于测试它的工作示例。

然后将动画组添加到父层,并在影响父层子层的动画中,使用 CAAnimationGroup 值创建这些子层动画,该值将子层引用为子层的命名子层父层。

所以如果我有 CAShapeLayer keyPath,它也有一个名为“sublayer”的子层,

parentLayer

我想创建一个动画组,同时为父层和子层的属性设置动画,代码可能如下所示:

let parentLayer = CAShapeLayer()
let sublayer = CAShapeLayer()
sublayer.name = "sublayer"
parentLayer.addSublayer(sublayer)

上面的代码不起作用。 问题似乎特别在于尝试为子图层的路径设置动画。如果我改为为子图层的旋转设置动画,请使用如下代码

let animationGroup = CAAnimationGroup()
animationGroup.duration = animationDuration

let parentLayerAnimation = CABasicAnimation(keyPath: "path")
parentLayerAnimation.duration = animationDuration
parentLayerAnimation.fromValue = parentLayer.path
parentLayerAnimation.tovalue = newPath

let sublayerAnimation = CABasicAnimation(keyPath: "sublayers.sublayer.path")
sublayerAnimation.duration = animationDuration
sublayerAnimation.fromValue = subLayer.path
sublayerAnimation.tovalue = newSublayerPath

let animationGroup = CAAnimationGroup()
animationGroup.duration = animationDuration
animationGroup.animations = [parentLayerAnimation,sublayerAnimation]
parentLayer.add(animationGroup,forKey: nil)

然后将 let sublayerRotationAnimation = CABasicAnimation(keyPath: "sublayers.sublayer.transform.rotation.z") sublayerRotationAnimation.duration = animationDuration sublayerRotationAnimation.fromValue = 0 sublayerRotationAnimation.tovalue = CGFloat.pi 添加到动画组, 起作用。

如果我尝试为子图层的路径设置动画,问题似乎就会发生。为其他属性设置动画。

(如果我将子图层动画的关键路径更改为“路径”并将动画直接添加到子图层,那也可以。)

我追求的效果是这样的:

enter image description here

(动画成圆弧的黑色插入符号是父层,带点的红线是子层sublayerRotationAnimation。)

我在 Github 上有一个工作项目的分支来说明这个问题:

Github project branch with animation group that doesn't work

main branch of the project 只是将单独的动画提交给层和子层,这很有效。

该分支中尝试添加动画组的代码位于 CaretToArcView.swift 文件中:

bezierIllustrationLayer

据我所知,这是 CAAnimationGroup 中的一个错误。如果我将其直接应用于子层(在适当更改 keyPath 之后),则相同的动画会起作用。不同属性的动画(如子层的 let pathAnimation = CABasicAnimation(keyPath: "path") pathAnimation.duration = animationDuration pathAnimation.timingFunction = camediatimingFunction(name: camediatimingFunctionName.easeInEaSEOut) pathAnimation.fromValue = layer.path pathAnimation.tovalue = path.cgPath // This animation does not work when added to an animation group applied to the parent layer of the bezierIllustrationLayer let bezierPathAnimation = CABasicAnimation(keyPath: "sublayers.bezierillustrationlayer.path") bezierPathAnimation.duration = animationDuration bezierPathAnimation.timingFunction = camediatimingFunction(name: camediatimingFunctionName.easeInEaSEOut) bezierPathAnimation.fromValue = bezierIllustrationLayer.path bezierPathAnimation.tovalue = illustrationPath.cgPath //If I add this rotation animation to the animation group,it works //let rotationAnimation = CABasicAnimation(keyPath: "sublayers.bezierillustrationlayer.transform.rotation.z") //rotationAnimation.duration = 1.0 //rotationAnimation.timingFunction = camediatimingFunction(name: camediatimingFunctionName.easeInEaSEOut) //rotationAnimation.fromValue = 0 //rotationAnimation.tovalue = CGFloat.pi * 2 let animationGroup = CAAnimationGroup() animationGroup.duration = animationDuration animationGroup.timingFunction = camediatimingFunction(name: camediatimingFunctionName.easeInEaSEOut) animationGroup.animations = [pathAnimation,bezierPathAnimation] layer.add(animationGroup,forKey: nil) dispatchQueue.main.asyncAfter(deadline: .Now() + 0.1) { layer.path = path.cgPath self.bezierIllustrationLayer.path = illustrationPath.cgPath } )在动画组中工作。它只是为失败的子层路径设置动画。

有没有其他人遇到过这种情况,您有解决方案吗?马特?我认为您是这里 CAAnimation 的权威专家。你能帮忙吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...