Özel geçiş, yerleşik geçiş sınıflarının hiçbirinde bulunmayan bir animasyon oluşturmanıza olanak tanır. Örneğin, yeni ekranda alanların devre dışı olduğunu belirtmek için metin ve giriş alanlarının ön plan rengini gri yapan özel bir geçiş tanımlayabilirsiniz. Bu tür bir değişiklik, kullanıcıların devre dışı bıraktığınız alanları görmesine yardımcı olur.
Yerleşik geçiş türlerinden biri gibi özel geçişler, hem başlangıç hem de bitiş sahnelerinin alt görünümlerine animasyon uygular. Ancak yerleşik geçiş türlerinden farklı olarak, özellik değerlerini yakalayan ve animasyon oluşturan kodu sağlamanız gerekir. Animasyonunuz için hedef görünümlerin bir alt kümesini de tanımlayabilirsiniz.
Bu sayfada, özel geçişler oluşturmak için mülk değerlerini nasıl yakalayacağınız ve animasyonlar oluşturacağınız açıklanmaktadır.
Geçiş sınıfını uzatma
Özel bir geçiş oluşturmak için projenize Transition
sınıfını genişleten ve aşağıdaki snippet'te gösterilen işlevleri geçersiz kılan bir sınıf ekleyin:
Kotlin
class CustomTransition : Transition() { override fun captureStartValues(transitionValues: TransitionValues) {} override fun captureEndValues(transitionValues: TransitionValues) {} override fun createAnimator( sceneRoot: ViewGroup, startValues: TransitionValues?, endValues: TransitionValues? ): Animator? {} }
Java
public class CustomTransition extends Transition { @Override public void captureStartValues(TransitionValues values) {} @Override public void captureEndValues(TransitionValues values) {} @Override public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues) {} }
Aşağıdaki bölümlerde bu işlevlerin nasıl geçersiz kılınacağı açıklanmaktadır.
Görünüm özelliği değerlerini yakalama
Geçiş animasyonları, Mülk animasyonuna genel bakış bölümünde açıklanan mülk animasyon sistemini kullanır. Mülk animasyonları, bir görünüm mülkünü belirli bir süre boyunca başlangıç değerinden bitiş değerine değiştirir. Bu nedenle, çerçevenin animasyonu oluşturmak için mülkün hem başlangıç hem de bitiş değerlerine sahip olması gerekir.
Ancak bir mülk animasyonu için genellikle tüm görünümün mülk değerlerinin yalnızca küçük bir alt kümesi gerekir. Örneğin, renk animasyonunda renk özelliği değerleri, hareket animasyonunda ise konum özelliği değerleri gerekir. Animasyon için gereken özellik değerleri geçişe özgü olduğundan geçiş çerçevesi, her özellik değerini geçişe sağlamaz. Bunun yerine, çerçeve yalnızca ihtiyaç duyduğu mülk değerlerini yakalayıp çerçevede depolamaya olanak tanıyan geri çağırma işlevlerini çağırır.
Başlangıç değerlerini yakalama
Başlangıç görüntüleme değerlerini çerçeveye iletmek için captureStartValues(transitionValues)
işlevini uygulayın. Çerçeve, başlangıç sahnesindeki her görünüm için bu işlevi çağırır. İşlev bağımsız değişkeni, görünüme referans içeren bir TransitionValues
nesnesi ve istediğiniz görünüm değerlerini depolayabileceğiniz bir Map
örneğidir. Uygulamanızda bu mülk değerlerini alın ve haritaya kaydederek çerçeveye geri gönderin.
Bir özellik değerinin anahtarının diğer TransitionValues
anahtarlarıyla çakışmaması için aşağıdaki adlandırma şemasını kullanın:
package_name:transition_name:property_name
Aşağıdaki snippet'te captureStartValues()
işlevinin bir uygulaması gösterilmektedir:
Kotlin
class CustomTransition : Transition() { // Define a key for storing a property value in // TransitionValues.values with the syntax // package_name:transition_class:property_name to avoid collisions private val PROPNAME_BACKGROUND = "com.example.android.customtransition:CustomTransition:background" override fun captureStartValues(transitionValues: TransitionValues) { // Call the convenience method captureValues captureValues(transitionValues) } // For the view in transitionValues.view, get the values you // want and put them in transitionValues.values private fun captureValues(transitionValues: TransitionValues) { // Get a reference to the view val view = transitionValues.view // Store its background property in the values map transitionValues.values[PROPNAME_BACKGROUND] = view.background } ... }
Java
public class CustomTransition extends Transition { // Define a key for storing a property value in // TransitionValues.values with the syntax // package_name:transition_class:property_name to avoid collisions private static final String PROPNAME_BACKGROUND = "com.example.android.customtransition:CustomTransition:background"; @Override public void captureStartValues(TransitionValues transitionValues) { // Call the convenience method captureValues captureValues(transitionValues); } // For the view in transitionValues.view, get the values you // want and put them in transitionValues.values private void captureValues(TransitionValues transitionValues) { // Get a reference to the view View view = transitionValues.view; // Store its background property in the values map transitionValues.values.put(PROPNAME_BACKGROUND, view.getBackground()); } ... }
Bitiş değerlerini yakalama
Çerçeve, bitiş sahnesindeki her hedef görünüm için captureEndValues(TransitionValues)
işlevini bir kez çağırır. captureEndValues()
, diğer tüm açılardan captureStartValues()
ile aynı şekilde çalışır.
Aşağıdaki kod snippet'inde captureEndValues()
işlevinin bir uygulaması gösterilmektedir:
Kotlin
override fun captureEndValues(transitionValues: TransitionValues) { captureValues(transitionValues) }
Java
@Override public void captureEndValues(TransitionValues transitionValues) { captureValues(transitionValues); }
Bu örnekte hem captureStartValues()
hem de captureEndValues()
işlevleri, değerleri almak ve depolamak için captureValues()
işlevini çağırır. captureValues()
tarafından alınan görünüm özelliği aynıdır ancak başlangıç ve bitiş sahnelerinde farklı değerlere sahiptir. Çerçeve, bir görünümün başlangıç ve bitiş durumları için ayrı haritalar tutar.
Özel animatör oluşturma
Bir görünümün başlangıç sahnesindeki durumu ile bitiş sahnesindeki durumu arasındaki değişiklikleri animasyonlu olarak göstermek için createAnimator()
işlevini geçersiz kılarak bir animatör sağlayın. Çerçeve bu işlevi çağırdığında, sahne kök görünümünü ve yakaladığınız başlangıç ve bitiş değerlerini içeren TransitionValues
nesnelerini iletir.
Çerçevenin createAnimator()
işlevini çağırma sayısı, başlangıç ve bitiş sahneleri arasında gerçekleşen değişikliklere bağlıdır.
Örneğin, özel geçiş olarak uygulanan bir karartma veya aydınlatma animasyonu düşünün. Başlangıç sahnesinde beş hedef varsa ve bunlardan ikisi bitiş sahnesinden kaldırılırsa ve bitiş sahnesinde başlangıç sahnesindeki üç hedefin yanı sıra yeni bir hedef varsa çerçeve createAnimator()
işlevini altı kez çağırır.
Çağrıları üçü, her iki sahne nesnesinde de kalan hedeflerin karartılmasını ve parlatılmasını animasyonlu olarak gösterir. İki çağrı daha, bitiş sahnesinden kaldırılan hedeflerin kaybolmasını animasyonlu olarak gösterir. Bir çağrı, bitiş sahnesinde yeni hedefin yavaşça görünmesini animasyonlu olarak gösterir.
Hem başlangıç hem de bitiş sahnelerinde bulunan hedef görünümler için çerçeve, hem startValues
hem de endValues
bağımsız değişkenleri için bir TransitionValues
nesnesi sağlar. Yalnızca başlangıç veya bitiş sahnesinde bulunan hedef görünümler için çerçeve, ilgili bağımsız değişken için bir TransitionValues
nesnesi ve diğeri için null
sağlar.
Özel geçiş oluştururken createAnimator(ViewGroup, TransitionValues, TransitionValues)
işlevini uygulamak için yakaladığınız görüntüleme özelliği değerlerini kullanarak bir Animator
nesnesi oluşturun ve bu nesneyi çerçeveye döndürün. Örnek uygulama için
CustomTransition örneğindeki ChangeColor
sınıfına bakın. Mülk animatörleri hakkında daha fazla bilgi için Mülk animasyonu başlıklı makaleyi inceleyin.
Özel geçiş uygulama
Özel geçişler, yerleşik geçişlerle aynı şekilde çalışır. Geçiş uygulama bölümünde açıklandığı gibi, geçiş yöneticisini kullanarak özel bir geçiş uygulayabilirsiniz.