Özel geçiş animasyonu oluşturma

Ö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ışı bırakıldığını belirtmek için metnin ve giriş alanlarının ön plan rengini griye çeviren özel bir geçiş tanımlayabilirsiniz. Bu tür değişiklikler, 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 bir geçiş, animasyonları hem başlangıç hem de bitiş sahnelerinin alt görünümlerine uygular. Ancak yerleşik geçiş türlerinin aksine, özellik değerlerini yakalayan ve animasyonlar oluşturan kodu sağlamanız gerekir. Animasyonunuz için hedef görüntülemelerin bir alt kümesini de tanımlamak isteyebilirsiniz.

Bu sayfada, özellik değerlerini yakalama ve özel geçişler oluşturmak için animasyonlar oluşturma hakkında bilgi verilmektedir.

Geçiş sınıfını genişlet

Özel 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 özellik animasyonu sistemini kullanır. Mülk animasyonları, bir görüntüleme özelliğini belirli bir süre içinde başlangıç değerinden bitiş değerine değiştirir. Bu nedenle, animasyonun oluşturulması için çerçevenin özelliğin hem başlangıç hem de bitiş değerlerine sahip olması gerekir.

Ancak bir mülk animasyonu genellikle görünümün tüm mülk değerlerinin yalnızca küçük bir alt grubuna ihtiyaç duyar. Örneğin, bir renk animasyonu için renk özelliği değerleri gerekirken, hareket animasyonu için konum özelliği değerleri gerekir. Bir animasyon için gereken özellik değerleri bir geçişe özgü olduğundan geçiş çerçevesi, bir geçişe her özellik değerini sağlamaz. Bunun yerine çerçeve, bir geçişin yalnızca ihtiyaç duyduğu özellik değerlerini yakalamasına ve bunları çerçevede depolamasına olanak tanıyan geri çağırma işlevlerini çağırır.

Başlangıç değerlerini yakala

Başlangıç görünümü değerlerini çerçeveye iletmek için captureStartValues(transitionValues) işlevini uygulayın. Çerçeve bu işlevi başlangıç sahnesindeki her görünüm için çağırır. İşlev bağımsız değişkeni, görünüm referansı içeren bir TransitionValues nesnesi ve istediğiniz görünüm değerlerini depolayabileceğiniz bir Map örneğidir. Uygulamanızda, bu özellik değerlerini alın ve haritada saklayarak çerçeveye geri aktarın.

Bir özellik değeri anahtarının diğer TransitionValues anahtarlarıyla çakışmadığından emin olmak 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 yakala

Ç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 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() ürününün aldığı 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 bir animatör oluşturun

Bir görünümdeki değişikliklerin başlangıç sahnesindeki durumu ile bitiş sahnesindeki durumu arasındaki değişikliklere animasyon eklemek 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üne ve yakaladığınız başlangıç ile bitiş değerlerini içeren TransitionValues nesnelerine geçer.

Ç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 uygulanmış bir geçiş animasyonu veya belirme animasyonu düşünün. Başlangıç sahnesinde beş hedef varsa ve bunlardan ikisi bitiş sahnesinden kaldırılmışsa ve bitiş sahnesinde başlangıç sahnesindeki üç hedef ile yeni bir hedef varsa çerçeve, createAnimator() değerini altı kez çağırır. Çağrılardan üçü, her iki sahne nesnesinde kalan hedeflerin sönme ve sönme hareketini canlandırır. İki aramada daha, bitiş sahnesinden kaldırılan hedeflerin sönme animasyonunu canlandırıyoruz. Bir çağrı, bitiş sahnesinde yeni hedefin sönme animasyonunu göstermektedir.

Hem başlangıç hem de bitiş sahnelerinde bulunan hedef görünümlerde ç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ümlerde çerçeve, karşılık gelen bağımsız değişken için bir TransitionValues nesnesi ve diğeri için null sağlar.

Özel bir geçiş oluştururken createAnimator(ViewGroup, TransitionValues, TransitionValues) işlevini uygulamak için, yakaladığınız görünüm özelliği değerlerini kullanarak Animator nesnesi oluşturun ve bunu çerçeveye döndürün. Örnek uygulama için CustomTransition örneğindeki ChangeColor sınıfına bakın. Tesis animatörleri hakkında daha fazla bilgi için Mülk animasyonu konusuna bakın.

Ö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, bir geçiş yöneticisi kullanarak özel geçiş uygulayabilirsiniz.