Özel Animasyonlara Genel Bakış
Bu konu başlığında, WPF özel anahtar çerçeveler, animasyon sınıfları oluşturarak ya da bu öğeyi atlamak için kare başına geri çağırma kullanarak animasyon sisteminin nasıl ve ne zaman genişletileceği açıklanmaktadır.
Önkoşullar
Bu konuyu anlamak için, tarafından sunulan farklı animasyon türleri hakkında bilgi sahibi olmanız gerekir WPF . Daha fazla bilgi için bkz. From/To/By animasyonlara genel bakış, anahtar çerçeve Animasyonlarına Genelbakış ve yol animasyonlara genelbakış.
Animasyon sınıfları sınıfından devraldığı için Freezable Freezable nesneler ve ' den devralma hakkında bilgi sahibi olmanız gerekir Freezable . Daha fazla bilgi için bkz. Freezable nesnelerine genel bakış.
Animasyon sistemini genişletme
WPFKullanmak istediğiniz yerleşik işlevselliğin düzeyine bağlı olarak, animasyon sistemini genişletmek için çeşitli yollar vardır. Animasyon altyapısında üç birincil genişletilebilirlik noktası vardır WPF :
Ana kare sınıflarından birinden devralarak özel bir anahtar çerçeve nesnesi oluşturun <Type> DoubleKeyFrame . Bu yaklaşım, animasyon altyapısının yerleşik işlevselliğinin çoğunu kullanır WPF .
AnimationTimelineAnimationBase sınıflarından veya birini devralarak kendi animasyon sınıfınızı oluşturun <Type> .
Çerçeve başına, animasyon oluşturmak için kare başına geri çağırma kullanın. Bu yaklaşım, animasyon ve zamanlama sistemini tamamen atlar.
Aşağıdaki tabloda, animasyon sisteminin genişlemesiyle ilgili bazı senaryolar açıklanmaktadır.
| İstediğiniz zaman... | Bu yaklaşımı kullanın |
|---|---|
| Karşılık gelen bir AnimationUsingKeyFrames 'e sahip olan bir türün değerleri arasındaki ilişkilendirmeyi özelleştirme <Type> | Özel bir anahtar çerçevesi oluşturun. Daha fazla bilgi için özel anahtar çerçevesi oluşturma bölümüne bakın. |
| Kendisine karşılık gelen animasyonu olan bir türün değerleri arasında ilişkilendirmeden fazlasını özelleştirin <Type> . | <Type> Hareketlendirmek istediğiniz türe karşılık gelen AnimationBase sınıfından devralan özel bir animasyon sınıfı oluşturun. Daha fazla bilgi için özel animasyon sınıfı oluşturma bölümüne bakın. |
| Karşılık gelen animasyonu olmayan bir türe animasyon ekleme WPF | ' İ kullanın ObjectAnimationUsingKeyFrames veya öğesinden devralan bir sınıf oluşturun AnimationTimeline . Daha fazla bilgi için özel animasyon sınıfı oluşturma bölümüne bakın. |
| Her karede hesaplanan ve son nesne etkileşimleri kümesini temel alan değerlerle birden çok nesneye animasyon ekleyin | Çerçeve başına geri çağırma kullanın. Daha fazla bilgi için bkz. Use Per-Frame geri araması oluşturma bölümü. |
Özel anahtar çerçevesi oluşturma
Özel anahtar çerçeve sınıfı oluşturmak, animasyon sistemini genişletmenin en kolay yoludur. Anahtar çerçeve animasyonu için farklı bir enterpolasyon yöntemi istediğinizde bu yaklaşımı kullanın. Anahtar çerçeve animasyonlara genel bakışbölümünde açıklandığı gibi, bir anahtar çerçeve animasyonu çıkış değerlerini oluşturmak için anahtar çerçeve nesnelerini kullanır. Her anahtar çerçeve nesnesi üç işlev gerçekleştirir:
Özelliğini kullanarak bir hedef değer belirtir Value .
Özelliği kullanılarak bu değere erişilmesi gereken süreyi belirtir KeyTime .
InterpolateValueCore metodunu uygulayarak önceki anahtar çerçevesinin değeri ile kendi değeri arasında enterpolasyonlar.
Uygulama yönergeleri
<Type> Ana kare soyut sınıfından türetir ve InterpolateValueCore yöntemini uygulayın. InterpolateValueCore yöntemi, anahtar çerçevesinin geçerli değerini döndürür. İki parametre alır: önceki anahtar çerçevesinin değeri ve 0 ile 1 arasında değişen bir ilerleme değeri. 0 ilerleme durumu, anahtar çerçevesinin yeni başlatıldığını gösterir ve 1 değeri anahtar çerçevesinin yalnızca tamamlandığını ve özelliği tarafından belirtilen değeri döndürmesi gerektiğini gösterir Value .
<Type> Ana kare sınıfları Freezable sınıfından devraldığı CreateInstanceCore için, sınıfınızın yeni bir örneğini döndürmek için de çekirdeği geçersiz kılmanız gerekir. Sınıf, verilerini depolamak için bağımlılık özelliklerini kullanmıyorsa veya oluşturulduktan sonra ek başlatma gerektiriyorsa, ek yöntemleri geçersiz kılmanız gerekebilir; daha fazla bilgi için Freezable nesnelerine genel bakış bölümüne bakın.
Özel <Type> Ana Kare animasyonunuzu oluşturduktan sonra <Type> Bu tür için AnimationUsingKeyFrames ile kullanabilirsiniz.
Özel bir animasyon sınıfı oluşturma
Kendi animasyon türünü oluşturmak, bir nesneye animasyon eklenmiş olarak daha fazla denetim sağlar. Kendi animasyon türünü oluşturmak için önerilen iki yöntem vardır: AnimationTimeline sınıfından veya <Type> AnimationBase sınıfından türetilebilir. <Type> Animation veya <Type> AnimationUsingKeyFrames sınıflarından türetmeniz önerilmez.
AnimationBase 'ten türet <Type>
Bir <Type> AnimationBase sınıfından türetmek, yeni bir animasyon türü oluşturmanın en kolay yoludur. Zaten karşılık gelen bir AnimationBase sınıfına sahip olan tür için yeni bir animasyon oluşturmak istediğinizde bu yaklaşımı kullanın <Type> .
Uygulama yönergeleri
Bir <Type> animasyon sınıfından türetebilir ve GetCurrentValueCore yöntemini uygulayın. GetCurrentValueCore yöntemi animasyonun geçerli değerini döndürür. Üç parametre vardır: önerilen başlangıç değeri, önerilen bitiş değeri ve AnimationClock animasyonun ilerlemesini belirlemek için kullandığınız bir.
<Type> AnimationBase sınıfları Freezable sınıfından devraldığı CreateInstanceCore için, sınıfınızın yeni bir örneğini döndürmek için de çekirdeği geçersiz kılmanız gerekir. Sınıf, verilerini depolamak için bağımlılık özelliklerini kullanmıyorsa veya oluşturulduktan sonra ek başlatma gerektiriyorsa, ek yöntemleri geçersiz kılmanız gerekebilir; daha fazla bilgi için Freezable nesnelerine genel bakış bölümüne bakın.
Daha fazla bilgi için, <Type> hareketlendirmek istediğiniz tür için AnimationBase sınıfının GetCurrentValueCore yöntemi belgelerine bakın. Bir örnek için bkz. özel animasyon örneği
Alternatif yaklaşımlar
Yalnızca animasyon değerlerinin nasıl ilişkilendirileceğini değiştirmek istiyorsanız, bir <Type> ana kare sınıflarından türetmeyi düşünün. Oluşturduğunuz anahtar çerçeve tarafından sunulan karşılık gelen AnimationUsingKeyFrames ile birlikte kullanılabilir <Type> WPF .
AnimationTimeline 'dan türet
AnimationTimelineZaten eşleşen bir animasyonuna sahip olmayan bir tür için animasyon oluşturmak istediğinizde WPF veya kesin olarak yazılmamış bir animasyon oluşturmak istediğinizde sınıfından türetebilirsiniz.
Uygulama yönergeleri
Sınıfından türet AnimationTimeline ve aşağıdaki üyeleri geçersiz kıl:
CreateInstanceCore – Yeni sınıfınız somut ise, CreateInstanceCore sınıfınızın yeni bir örneğini döndürmek için geçersiz kılmanız gerekir.
GetCurrentValue – Animasyonunuzun geçerli değerini döndürmek için bu yöntemi geçersiz kılın. Üç parametre alır: varsayılan bir kaynak değeri, varsayılan hedef değeri ve bir AnimationClock . AnimationClockAnimasyon için geçerli saati veya ilerlemeyi elde etmek için kullanın. Varsayılan kaynak ve hedef değerlerini kullanıp kullanmayacağınızı seçebilirsiniz.
IsDestinationDefault – Animasyonunuzun yöntem tarafından belirtilen varsayılan hedef değeri kullanıp kullanmadığını belirtmek için bu özelliği geçersiz kılın GetCurrentValue .
TargetPropertyType – Animasyonunuzun ürettiği çıktının konumunu belirtmek için bu özelliği geçersiz kılın Type .
Sınıf, verilerini depolamak için bağımlılık özelliklerini kullanmıyorsa veya oluşturulduktan sonra ek başlatma gerektiriyorsa, ek yöntemleri geçersiz kılmanız gerekebilir; daha fazla bilgi için Freezable nesnelerine genel bakış bölümüne bakın.
Önerilen paradigma (animasyonlar tarafından kullanılır WPF ) iki devralma düzeyi kullanmaktır:
<Type> Öğesinden türetilen bir soyut AnimationBase sınıfı oluşturun AnimationTimeline . Bu sınıf yöntemi geçersiz kılmalıdır TargetPropertyType . Ayrıca, GetCurrentValue varsayılan kaynak değer ve varsayılan hedef değer parametrelerinin türlerini doğrulamak için yeni bir soyut Yöntem, GetCurrentValueCore ve geçersiz kılma ve ardından GetCurrentValueCore öğesini çağırır.
Yeni AnimationBase sınıfınızı devralan başka bir sınıf oluşturun <Type> ve CreateInstanceCore yöntemi, kullanıma sunulan GetCurrentValueCore yöntemini ve özelliğini geçersiz kılar IsDestinationDefault .
Alternatif yaklaşımlar
Kendisine karşılık gelen/to/By animasyonuna veya anahtar çerçeve animasyonuna sahip olmayan bir türe animasyon eklemek istiyorsanız, kullanmayı düşünün ObjectAnimationUsingKeyFrames . Zayıf bir tür olduğundan, bir ObjectAnimationUsingKeyFrames değer türüne animasyon uygulayabilir. Bu yaklaşımın dezavantajı ObjectAnimationUsingKeyFrames yalnızca ayrık ilişkilendirmeyi desteklemesidir.
Per-Frame geri çağırma kullan
Animasyon sistemini tamamen atlamak istediğinizde bu yaklaşımı kullanın WPF . Bu yaklaşım için bir senaryo, her animasyon adımının yeni bir yön veya animasyonlu nesne konumunun son nesne etkileşimleri kümesine göre yeniden hesaplanması gereken fizik animasyonlarıdır.
Uygulama yönergeleri
Bu genel bakışta açıklanan diğer yaklaşımlardan farklı olarak, çerçeve başına geri çağırma kullanmak için özel bir animasyon veya anahtar çerçeve sınıfı oluşturmanız gerekmez.
Bunun yerine, Rendering animasyon eklemek istediğiniz nesneleri içeren nesnenin olayına kaydolabilirsiniz. Bu olay işleyicisi yöntemi çerçeve başına bir kez çağırılır. WPFGörsel ağaçtaki kalıcı işleme verilerini birleşim ağacına her sıraladığında olay işleyicisi yönteminiz çağırılır.
Olay işleyicinizde, animasyon efektiniz için gereken hesaplamaları gerçekleştirin ve bu değerlerle hareketlendirmek istediğiniz nesnelerin özelliklerini ayarlayın.
Geçerli çerçevenin sunum süresini elde etmek için, EventArgs Bu olayla ilişkili olarak, RenderingEventArgs RenderingTime Geçerli çerçevenin işleme süresini elde etmek için kullanabileceğiniz bir özellik sağlayan olarak atama yapılabilir.
Daha fazla bilgi için sayfasına bakın Rendering .