使用 UIView.Animate 动画图层不透明度
Animate Layer Opacity with UIView.Animate
我有 2 个 CALayers
,每个都有一个图像。两者都有 0
的初始 Opacity
。
我想在 1 秒内将 Layer1 的 Opacity
设置为 1
的动画,立即开始。然后在延迟 0.5 秒后,我想在 1 秒内将 Layer2 的 Opacity
动画化为 1
。这两层叠在一起。
我想要实现的是让第一张图片淡入,然后在它淡入时将第二张图片淡入。
但由于某些原因我无法使用 UIView.Animate
,因为它根本没有动画,只是直接设置值。
UIView.Animate(1, 0, UIViewAnimationOptions.CurveEaseIn, () =>
{
backgroundLayer.Opacity = 1;
}, () => UIView.Animate(5, () =>
{
backgroundLayer2.Opacity = 1;
}));
这里只是尝试 运行 一个接一个地直接播放动画,它仍然只是立即设置值,没有动画。
UIView 动画旨在为 UIView 属性设置动画,似乎不能很好地与 CALayers 一起播放。使用 UIImageViews 而不是 CALayers 可以解决您的问题(那么您应该使用 imageView.alpha 属性 而不是 layer.opacity 属性)。
但是,如果您坚持使用 CALayers,您可以使用 CABasicAnimation 为它们设置动画。下面的代码完成了您描述的动画(请注意,这是 Swift 代码,因为我不使用 Xamarin)。
var animation1 = CABasicAnimation(keyPath: "opacity")
// Don't go back to the initial state after the animation.
animation1.fillMode = kCAFillModeForwards
animation1.removedOnCompletion = false
// Set the initial and final states of the animation.
animation1.fromValue = 0
animation1.toValue = 1
// Duration of the animation.
animation1.duration = 1.0
var animation2 = CABasicAnimation(keyPath: "opacity")
animation2.fillMode = kCAFillModeForwards
animation2.removedOnCompletion = false
animation2.fromValue = 0
animation2.toValue = 1
animation2.duration = 1.0
// Add a 0.5 second delay.
animation2.beginTime = CACurrentMediaTime() + 0.5
// Animate!
backgroundLayer.addAnimation(animation1, forKey: "opacity")
backgroundLayer2.addAnimation(animation2, forKey: "opacity")
您只能使用 UIView.Animate 为以下属性设置动画:
- UIView.Frame
- UIView.Bounds
- UIView.Center
- UIView.Transform
- UIView.Alpha
- UIView.BackgroundColor
- UIView.ContentStretch
对于更复杂的动画,您必须像@bjornorri 回答中那样使用 CABasicAnimation。
你们是对的,因为我试图使用不正确的方法为图层设置动画。我最终做的是用 UIImageView
替换图层并使用 UIView.Animate
更改 Alpha
属性。
这不仅更容易编码,似乎 UIImageView
在处理图像时实际上性能更高。
我有 2 个 CALayers
,每个都有一个图像。两者都有 0
的初始 Opacity
。
我想在 1 秒内将 Layer1 的 Opacity
设置为 1
的动画,立即开始。然后在延迟 0.5 秒后,我想在 1 秒内将 Layer2 的 Opacity
动画化为 1
。这两层叠在一起。
我想要实现的是让第一张图片淡入,然后在它淡入时将第二张图片淡入。
但由于某些原因我无法使用 UIView.Animate
,因为它根本没有动画,只是直接设置值。
UIView.Animate(1, 0, UIViewAnimationOptions.CurveEaseIn, () =>
{
backgroundLayer.Opacity = 1;
}, () => UIView.Animate(5, () =>
{
backgroundLayer2.Opacity = 1;
}));
这里只是尝试 运行 一个接一个地直接播放动画,它仍然只是立即设置值,没有动画。
UIView 动画旨在为 UIView 属性设置动画,似乎不能很好地与 CALayers 一起播放。使用 UIImageViews 而不是 CALayers 可以解决您的问题(那么您应该使用 imageView.alpha 属性 而不是 layer.opacity 属性)。
但是,如果您坚持使用 CALayers,您可以使用 CABasicAnimation 为它们设置动画。下面的代码完成了您描述的动画(请注意,这是 Swift 代码,因为我不使用 Xamarin)。
var animation1 = CABasicAnimation(keyPath: "opacity")
// Don't go back to the initial state after the animation.
animation1.fillMode = kCAFillModeForwards
animation1.removedOnCompletion = false
// Set the initial and final states of the animation.
animation1.fromValue = 0
animation1.toValue = 1
// Duration of the animation.
animation1.duration = 1.0
var animation2 = CABasicAnimation(keyPath: "opacity")
animation2.fillMode = kCAFillModeForwards
animation2.removedOnCompletion = false
animation2.fromValue = 0
animation2.toValue = 1
animation2.duration = 1.0
// Add a 0.5 second delay.
animation2.beginTime = CACurrentMediaTime() + 0.5
// Animate!
backgroundLayer.addAnimation(animation1, forKey: "opacity")
backgroundLayer2.addAnimation(animation2, forKey: "opacity")
您只能使用 UIView.Animate 为以下属性设置动画:
- UIView.Frame
- UIView.Bounds
- UIView.Center
- UIView.Transform
- UIView.Alpha
- UIView.BackgroundColor
- UIView.ContentStretch
对于更复杂的动画,您必须像@bjornorri 回答中那样使用 CABasicAnimation。
你们是对的,因为我试图使用不正确的方法为图层设置动画。我最终做的是用 UIImageView
替换图层并使用 UIView.Animate
更改 Alpha
属性。
这不仅更容易编码,似乎 UIImageView
在处理图像时实际上性能更高。