Çeşitli yolları Bunu yapmanın. Anahtar çerçeveler ile
:
<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>
dizisinde iki animasyonlar: özel bir hareket hızı fonksiyonu ile
<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>
Bu durumda, sürenin ilk yarısında geçişi gösteren ve ikinci yarıda değeri tutan bir işlev. Varsayılan EasingMode EaseOut olduğundan, bu işlev daha sonra 'oynatır'.
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();
}
}
Çok kapsamlı ve tam olarak ne ben gerekli. Bu harika bir S.O. Ben de başkalarının bildiği gibi cevap verdiğiniz ayrıntı düzeyinden memnun olacaksınız. Çok teşekkürler! – MarqueIV
Bir soru olsa da ... Kolaylaştırma İşlevi örneğindeki yorumunuzdan emin misiniz? böylece dönüş değeri 0.5 (süresinin ilk yarısı), daha sonra olması daha az değerler için 0 olmalıdır, belirtildiği gibi MSDN'ye göre, normalize zaman değil '1 ila 0, 0 ile 1 arasında gider (normalizedTime x 2) - 1 '(ikinci yarı için' (normalizedTime - 0.5) * 2 ') ile aynı mı, doğru mu? Bende o buradan ... http://msdn.microsoft.com/en-us/library/system.windows.media.animation.easingfunctionbase.easeincore.aspx – MarqueIV
Aaah! 1'den 0'a neden gittiğinizi anladım. EasaseMode varsayılan olarak ayarlandı. EaseOut, 'Ease' den döndürülen değerlerin EaseInCore işlevinin sonucu olarak% 100 enterpolasyona eklenmesi gerektiğini belirtir. 1'den 0'a düştüğünü düşünüyorum. Eğer yapacaksanız çift negatif. Ancak, işlev EaseInCore olarak adlandırıldığı için, tutarlılık için muhtemelen 0'dan 1'e kadar olan zamanla yazılmalı, sonra EasingMode'un açıkça EaseIn'a ayarlanması gerekirdi, ancak yine de, işlev geçen süre geçeceğinden daha açık olurdu. doğru şekilde. – MarqueIV