2012-05-17 9 views
5

Kırmızıdan beyaza karışan bir renk animasyonumuz var. Şu anda, bu doğrusal bir soluktur. Storyboard sınıfının BeginTime ile oynayabileceğimizi biliyoruz, ancak bu sadece animasyonun başlangıcını geciktiriyor. Ayrıca, işlerin kolaylık/kolaylık tarafına baktık, ama ya işe yaramıyorlar.Devam etmeden önce WPF storyboard animasyonunu nasıl bir saniye tutabilirim?

Özellikle, bir saniye kırmızı değerini tutmak istiyorum, sonra bir sonraki üzerinde beyaz kırmızıdan kaybolur. Bu saf XAML'de yapılabilir mi? Aksi takdirde, bir storyboard'u manuel olarak ayarlayarak kod arkasında yapılabilir mi? ... ya da iki ayrı storyboard kullanmalı ve bunları sırayla oynamalı mıyız?

cevap

14

Ç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(); 
    } 
} 
+0

Ç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

+0

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

+2

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

1

Eğer animasyonlar yazdım şekline bağlı olarak, sadece başında bir saniye sürer Kırmızı "ile" Kırmızı "dan" geçiş eklemek olabilir. Teknik olarak animasyon çalışıyor, ancak hiçbir şey yapmıyor. Bu saf XAML'de yapılabilir.