我们有一个从红色到白色混合的彩色动画。目前,这是线性淡化。我们知道我们可以使用Storyboard
类的BeginTime等,但这只会延迟整个动画的开始。我们也看过易于放松的东西,但它们似乎也没有用。
具体来说,我们想要保持红色值一秒钟,然后在下一个点从红色淡化为白色。可以在纯XAML中完成吗?如果没有,可以在代码隐藏中手动设置故事板吗? ...或者我们是否必须使用两个单独的故事板并按顺序播放它们?
答案 0 :(得分:19)
有几种方法可以做到这一点。
关键帧:
<Storyboard>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="Background.Color">
<DiscreteColorKeyFrame Value="Red" KeyTime="0:0:0" />
<DiscreteColorKeyFrame Value="Red" KeyTime="0:0:1" />
<LinearColorKeyFrame Value="White" KeyTime="0:0:2" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
依次有两个动画:
<Storyboard>
<ColorAnimation Storyboard.TargetProperty="Background.Color"
From="Red" To="Red" Duration="0:0:1" />
<ColorAnimation Storyboard.TargetProperty="Background.Color"
To="White" BeginTime="0:0:1" Duration="0:0:1" />
</Storyboard>
使用自定义缓动功能:
<Storyboard>
<ColorAnimation Storyboard.TargetProperty="Background.Color"
From="Red" To="White" Duration="0:0:2">
<ColorAnimation.EasingFunction>
<local:CustomEasingFunction />
</ColorAnimation.EasingFunction>
</ColorAnimation>
</Storyboard>
在这种情况下,一个函数显示持续时间的前半部分的转换并保持后半部分的值。因为默认的EasingMode是EaseOut,所以这个函数将向后“播放”。
public class CustomEasingFunction : EasingFunctionBase
{
public CustomEasingFunction() : base()
{ }
protected override double EaseInCore(double normalizedTime)
{
return (normalizedTime < 0.5)
? normalizedTime * 2
: 1;
}
protected override Freezable CreateInstanceCore()
{
return new CustomEasingFunction();
}
}
答案 1 :(得分:1)
根据您编写动画的方式,您可以添加“从”红色“到”红色“的过渡,在开始时需要一秒钟。从技术上讲,动画正在运行,但它没有做任何事情。这可以在纯XAML中完成。