2012-05-17 10 views
5

हमारे पास एक रंगीन एनीमेशन है जो लाल से सफेद तक मिश्रण करता है। वर्तमान में, यह एक रैखिक फीका है। हम जानते हैं कि हम Storyboard कक्षा के शुरुआती समय और इस तरह के साथ खेल सकते हैं, लेकिन यह पूरी एनीमेशन की शुरुआत में देरी करता है। हमने चीजों के आसानी से/आसानी से बाहर की तरफ देखा है, लेकिन वे या तो काम नहीं कर रहे हैं।जारी रखने से पहले, मैं एक सेकंड के लिए एक डब्ल्यूपीएफ स्टोरीबोर्ड एनीमेशन कैसे रख सकता हूं?

विशेष रूप से, हम एक सेकंड के लिए लाल रंग का मान रखना चाहते हैं, फिर अगले से लाल से सफेद तक फीका। क्या यह शुद्ध एक्सएएमएल में किया जा सकता है? यदि नहीं, तो क्या यह मैन्युअल रूप से स्टोरीबोर्ड स्थापित करने के बाद कोड-कोड में किया जा सकता है? ... या क्या हमें दो अलग-अलग स्टोरीबोर्ड का उपयोग करना है और उन्हें अनुक्रम में खेलना है?

उत्तर

14

ऐसा करने के कई तरीके।

<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> 
अनुक्रम में दो एनिमेशन के साथ

<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> 

:

कुंजी फ्रेम के साथ

इस मामले में एक कार्य जो अवधि के पहले भाग में संक्रमण दिखाता है और दूसरे छमाही में मूल्य रखता है। क्योंकि डिफ़ॉल्ट EasingMode आसान है क्योंकि यह फ़ंक्शन फिर 'प्ले' करेगा।

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

बहुत अच्छी और बिल्कुल मुझे जो चाहिए। यह एक महान एसओ है। उत्तर दें क्योंकि मुझे पता है कि दूसरों ने आपके द्वारा प्रदान किए गए विवरण के स्तर से खुश होंगे। बहुत बहुत धन्यवाद! – MarqueIV

+0

हालांकि एक प्रश्न ... क्या आप आसान फ़ंक्शन उदाहरण में आपकी टिप्पणी के बारे में निश्चित हैं? एमएसडीएन के मुताबिक, सामान्यीकृत समय 0 से 1 तक जाता है, जैसा कि आपने कहा था, 1 से 0 नहीं, इस प्रकार वापसी मूल्य 0.5 से कम मानों के लिए 0 होना चाहिए (अवधि का पहला भाग), फिर '(सामान्यीकृत समय * 2) - 1 '(जो कि दूसरी छमाही के लिए' (सामान्यीकृत समय - 0.5) * 2 'के समान है) सही है? मुझे यह मिला है ... http://msdn.microsoft.com/en-us/library/system.windows.media.animation.easingfunctionbase.easeincore.aspx – MarqueIV

+2

आहा! मुझे पता चला कि आप 1 से 0 तक क्यों गए थे। आपके पास EasingMode डिफ़ॉल्ट पर सेट है जो EasyOut है, जो कहता है कि 'आसानी' से लौटाए गए मान EasyInCore फ़ंक्शन के परिणाम से 100% इंटरपोलेशन कम होना चाहिए, इसलिए आप यह सोचकर 1 से 0 तक चला गया। यदि आप करेंगे तो एक डबल-नकारात्मक। हालांकि, क्योंकि फ़ंक्शन को EasyInCore कहा जाता है, स्थिरता के लिए इसे शायद 0 से 1 के समय के साथ लिखा जाना चाहिए, फिर EasingMode को आसानी से EaseIn पर सेट करना होगा, लेकिन फिर से, यह स्पष्ट होगा क्योंकि फ़ंक्शन समय समाप्त हो जाएगा सही ढंग से। स्पष्टीकरण के लिए – MarqueIV

1

आपके एनिमेशन को कैसे लिखा गया है, इस पर निर्भर करते हुए, आप केवल "लाल" से "लाल" में एक संक्रमण जोड़ सकते हैं जो शुरुआत में एक सेकंड लेता है। तो तकनीकी रूप से एनीमेशन चल रहा है, लेकिन यह कुछ भी नहीं कर रहा है। यह शुद्ध एक्सएएमएल में किया जा सकता है।

संबंधित मुद्दे

 संबंधित मुद्दे