Düzen değişikliklerini geçiş kullanarak canlandırma

Compose yöntemini deneyin
Jetpack Compose, Android için önerilen kullanıcı arayüzü araç setidir. Compose'da animasyonları nasıl kullanacağınızı öğrenin.

Android'in geçiş çerçevesi, başlangıç ve bitiş düzenlerini sağlayarak kullanıcı arayüzünüzdeki her türlü hareketi canlandırmanıza olanak tanır. Görünümleri soldurarak gösterme veya gizleme ya da görünüm boyutlarını değiştirme gibi istediğiniz animasyon türünü seçebilirsiniz. Geçiş çerçevesi, başlangıç düzeninden bitiş düzenine nasıl animasyon uygulanacağını belirler.

Geçiş çerçevesi aşağıdaki özellikleri içerir:

  • Grup düzeyinde animasyonlar: Animasyon efektlerini bir görünüm hiyerarşisindeki tüm görünümlere uygulayın.
  • Yerleşik animasyonlar: Silinme veya hareket gibi yaygın efektler için önceden tanımlanmış animasyonları kullanın.
  • Kaynak dosyası desteği: Görünüm hiyerarşilerini ve yerleşik animasyonları düzen kaynak dosyalarından yükleyin.
  • Yaşam döngüsü geri çağırmaları: Animasyon ve hiyerarşi değişikliği süreci üzerinde kontrol sağlayan geri çağırmalar alın.

Düzen değişiklikleri arasında animasyon oluşturan örnek kod için BasicTransition'a bakın.

İki düzen arasında animasyon oluşturmak için temel süreç şu şekildedir:

  1. Başlangıç ve bitiş düzenleri için bir Scene nesnesi oluşturun. Ancak başlangıç düzeninin sahnesi genellikle mevcut düzenden otomatik olarak belirlenir.
  2. Ne tür bir animasyon istediğinizi tanımlamak için Transition nesnesi oluşturun.
  3. TransitionManager.go() yöntemini çağırın. Sistem, düzenleri değiştirmek için animasyonu çalıştırır.

Şekil 1'deki diyagramda düzenleriniz, sahneler, geçiş ve son animasyon arasındaki ilişki gösterilmektedir.

Şekil 1. Geçiş çerçevesinin nasıl animasyon oluşturduğuna dair temel bir görsel.

Sahne oluşturma

Sahneler, tüm görünümleri ve bunların özellik değerleri de dahil olmak üzere bir görünüm hiyerarşisinin durumunu depolar. Geçişler çerçevesi, başlangıç ve bitiş sahneleri arasında animasyonlar çalıştırabilir.

Sahnelerinizi bir düzen kaynak dosyasından veya kodunuzdaki bir görünüm grubundan oluşturabilirsiniz. Ancak geçişinizin başlangıç sahnesi genellikle mevcut kullanıcı arayüzünden otomatik olarak belirlenir.

Bir sahne, sahne değişikliği yaptığınızda çalıştırılan kendi işlemlerini de tanımlayabilir. Bu özellik, bir sahneye geçiş yaptıktan sonra görünüm ayarlarını temizlemek için kullanışlıdır.

Düzen kaynağı kullanarak sahne oluşturma

Doğrudan bir düzen kaynağı dosyasından Scene örneği oluşturabilirsiniz. Dosyadaki görünüm hiyerarşisi çoğunlukla statik olduğunda bu tekniği kullanın. Ortaya çıkan sahne, Scene örneğini oluşturduğunuz sırada görünüm hiyerarşisinin durumunu gösterir. Görünüm hiyerarşisini değiştirirseniz sahneyi yeniden oluşturun. Çerçeve, dosyadaki görünüm hiyerarşisinin tamamından sahneyi oluşturur. Bir düzen dosyasının bir bölümünden sahne oluşturamazsınız.

Bir düzen kaynağı dosyasından Scene örneği oluşturmak için düzeninizdeki sahne kökünü ViewGroup olarak alın. Ardından, sahne kökü ve sahnenin görünüm hiyerarşisini içeren düzen dosyasının kaynak kimliğiyle Scene.getSceneForLayout() işlevini çağırın.

Sahneler için düzen tanımlama

Bu bölümün geri kalanındaki kod snippet'lerinde, aynı sahne kök öğesiyle iki farklı sahnenin nasıl oluşturulacağı gösterilmektedir. Ayrıca snippet'ler, birbiriyle ilişkili oldukları anlamına gelmeden birden fazla alakasız Scene nesne yükleyebileceğinizi de gösterir.

Örnek, aşağıdaki düzen tanımlarından oluşur:

  • Metin etiketi ve alt öğesi olan bir etkinliğin ana düzeni FrameLayout.
  • İki metin alanı içeren ilk sahne için ConstraintLayout.
  • İkinci sahne için ConstraintLayout. Bu sahnede aynı iki metin alanı farklı sırada yer alıyor.

Örnek, animasyonun tamamı etkinliğin ana düzeninin alt düzeninde gerçekleşecek şekilde tasarlanmıştır. Ana düzendeki metin etiketi statik kalır.

Etkinliğin ana düzeni şu şekilde tanımlanır:

res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/master_layout">
    <TextView
        android:id="@+id/title"
        ...
        android:text="Title"/>
    <FrameLayout
        android:id="@+id/scene_root">
        <include layout="@layout/a_scene" />
    </FrameLayout>
</LinearLayout>

Bu düzen tanımı, bir metin alanı ve sahne kökü için bir alt FrameLayout içeriyor. İlk sahnenin düzeni, ana düzen dosyasına dahil edilir. Bu sayede uygulama, çerçeve yalnızca tam bir düzen dosyasını bir sahneye yükleyebildiğinden, düzeni ilk kullanıcı arayüzünün bir parçası olarak gösterebilir ve sahneye de yükleyebilir.

İlk sahnenin düzeni aşağıdaki şekilde tanımlanır:

res/layout/a_scene.xml

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/scene_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <TextView
        android:id="@+id/text_view1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="Text Line 1"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>
    <TextView
        android:id="@+id/text_view2"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="Text Line 2"
        app:layout_constraintTop_toBottomOf="@id/text_view1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

İkinci sahnenin düzeninde, farklı sırada yerleştirilmiş aynı kimliklere sahip aynı iki metin alanı bulunur. Şu şekilde tanımlanır:

res/layout/another_scene.xml

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/scene_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <TextView
        android:id="@+id/text_view2"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="Text Line 2"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />
    <TextView
        android:id="@+id/text_view1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="Text Line 1"
        app:layout_constraintTop_toBottomOf="@id/text_view2"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

Düzenlerden sahne oluşturma

İki kısıtlama düzeni için tanımlar oluşturduktan sonra her biri için bir sahne elde edebilirsiniz. Bu sayede iki kullanıcı arayüzü yapılandırması arasında geçiş yapabilirsiniz. Sahne almak için sahne köküne ve düzen kaynağı kimliğine referans vermeniz gerekir.

Aşağıdaki kod snippet'inde, sahne köküne nasıl referans alınacağı ve düzen dosyalarından iki Scene nesnesinin nasıl oluşturulacağı gösterilmektedir:

Kotlin

val sceneRoot: ViewGroup = findViewById(R.id.scene_root)
val aScene: Scene = Scene.getSceneForLayout(sceneRoot, R.layout.a_scene, this)
val anotherScene: Scene = Scene.getSceneForLayout(sceneRoot, R.layout.another_scene, this)

Java

Scene aScene;
Scene anotherScene;

// Create the scene root for the scenes in this app.
sceneRoot = (ViewGroup) findViewById(R.id.scene_root);

// Create the scenes.
aScene = Scene.getSceneForLayout(sceneRoot, R.layout.a_scene, this);
anotherScene =
    Scene.getSceneForLayout(sceneRoot, R.layout.another_scene, this);

Uygulamada artık görünüm hiyerarşilerine dayalı iki Scene nesne var. Her iki sahne de res/layout/activity_main.xml içindeki FrameLayout öğesiyle tanımlanan sahne kökünü kullanır.

Kodunuzda sahne oluşturma

Ayrıca, kodunuzda Scene nesnesinden ViewGroup örneği de oluşturabilirsiniz. Görünüm hiyerarşilerini doğrudan kodunuzda değiştirdiğinizde veya bunları dinamik olarak oluşturduğunuzda bu tekniği kullanın.

Kodunuzdaki bir görünüm hiyerarşisinden sahne oluşturmak için Scene(sceneRoot, viewHierarchy) yapılandırıcısını kullanın. Bu oluşturucuyu çağırmak, bir düzen dosyasını zaten genişlettiğinizde Scene.getSceneForLayout() işlevini çağırmaya eş değerdir.

Aşağıdaki kod snippet'inde, kodunuzdaki sahne için sahne kök öğesinden ve görünüm hiyerarşisinden nasıl Scene örneği oluşturulacağı gösterilmektedir:

Kotlin

val sceneRoot = someLayoutElement as ViewGroup
val viewHierarchy = someOtherLayoutElement as ViewGroup
val scene: Scene = Scene(sceneRoot, viewHierarchy)

Java

Scene mScene;

// Obtain the scene root element.
sceneRoot = (ViewGroup) someLayoutElement;

// Obtain the view hierarchy to add as a child of
// the scene root when this scene is entered.
viewHierarchy = (ViewGroup) someOtherLayoutElement;

// Create a scene.
mScene = new Scene(sceneRoot, mViewHierarchy);

Sahne işlemleri oluşturma

Bu çerçeve, sisteme bir sahneye girildiğinde veya sahneden çıkıldığında çalıştırılacak özel sahne işlemleri tanımlamanıza olanak tanır. Çerçeve, sahneler arasındaki değişikliği otomatik olarak canlandırdığı için çoğu durumda özel sahne işlemleri tanımlamak gereksizdir.

Sahne işlemleri şu durumlarda kullanışlıdır:

  • Aynı hiyerarşide olmayan görünümleri canlandırmak için. Başlangıç ve bitiş sahneleri için çıkış ve giriş sahnesi işlemlerini kullanarak görünümleri animasyonlu hâle getirebilirsiniz.
  • Geçiş çerçevesinin otomatik olarak animasyon ekleyemediği görünümlere (ör. ListView nesneleri) animasyon eklemek için. Daha fazla bilgi için sınırlamalar bölümüne bakın.

Özel sahne işlemleri sağlamak için işlemlerinizi Runnable nesneleri olarak tanımlayın ve bunları Scene.setExitAction() veya Scene.setEnterAction() işlevlerine iletin. Çerçeve, geçiş animasyonunu çalıştırmadan önce başlangıç sahnesinde setExitAction() işlevini, geçiş animasyonunu çalıştırdıktan sonra ise bitiş sahnesinde setEnterAction() işlevini çağırır.

Geçiş uygulama

Geçiş çerçevesi, Transition nesnesiyle sahneler arasındaki animasyon stilini temsil eder. AutoTransition ve Fade gibi yerleşik alt sınıfları kullanarak bir Transition oluşturabilir veya kendi geçişinizi tanımlayabilirsiniz. Ardından, son Scene ve Transition öğesini TransitionManager.go() öğesine ileterek sahneler arasında animasyon çalıştırabilirsiniz.

Geçiş yaşam döngüsü, etkinlik yaşam döngüsüne benzer ve çerçevenin bir animasyonun başlangıcı ile tamamlanması arasında izlediği geçiş durumlarını temsil eder. Çerçeve, yaşam döngüsünün önemli aşamalarında, geçişin farklı aşamalarında kullanıcı arayüzünüzü ayarlamak için uygulayabileceğiniz geri çağırma işlevlerini çağırır.

Geçiş oluşturma

Önceki bölümde, farklı görünüm hiyerarşilerinin durumunu temsil eden sahnelerin nasıl oluşturulacağı gösterilmektedir. Değiştirmek istediğiniz başlangıç ve bitiş sahnelerini tanımladıktan sonra, animasyonu tanımlayan bir Transition nesnesi oluşturun. Bu çerçeve, bir kaynak dosyasında yerleşik bir geçiş belirtmenize ve bunu kodunuzda genişletmenize ya da doğrudan kodunuzda yerleşik bir geçişin örneğini oluşturmanıza olanak tanır.

Tablo 1. Yerleşik geçiş türleri.

Sınıf Etiket Efekt
AutoTransition <autoTransition/> Varsayılan geçiş. Görünümler sırasıyla soluklaştırılır, taşınır ve yeniden boyutlandırılır, ardından görünür hale getirilir.
ChangeBounds <changeBounds/> Görünümleri taşır ve yeniden boyutlandırır.
ChangeClipBounds <changeClipBounds/> Sahne değişikliğinden önce ve sonraki View.getClipBounds() yakalanır ve geçiş sırasında bu değişiklikler animasyonla gösterilir.
ChangeImageTransform <changeImageTransform/> Sahne değişikliğinden önce ve sonraki ImageView matrisini yakalar ve geçiş sırasında animasyonunu yapar.
ChangeScroll <changeScroll/> Sahne değişikliğinden önce ve sonra hedeflerin kaydırma özelliklerini yakalar ve değişiklikleri animasyonla gösterir.
ChangeTransform <changeTransform/> Görünümlerin ölçeğini ve dönüşünü sahne değişikliğinden önce ve sonra yakalar ve geçiş sırasında bu değişiklikleri animasyonla gösterir.
Explode <explode/> Başlangıç ve bitiş sahnelerindeki hedef görünümlerin görünürlüğünde yapılan değişiklikleri izler ve görünümleri sahnenin kenarlarına doğru veya kenarlarından uzağa taşır.
Fade <fade/> fade_in, görünümlerde soluklaşıyor.
fade_out, görünümleri soldurur.
fade_in_out (varsayılan) fade_out işlemi yapar ve ardından fade_in işlemi yapılır.
Slide <slide/> Başlangıç ve bitiş sahnelerindeki hedef görünümlerin görünürlüğünde yapılan değişiklikleri izler ve görünümleri sahnenin kenarlarından birine veya dışına taşır.

Kaynak dosyasından geçiş örneği oluşturma

Bu teknik, geçiş tanımınızı etkinliğinizin kodunu değiştirmeden düzenlemenize olanak tanır. Bu teknik, birden fazla geçiş belirtme bölümünde gösterildiği gibi, karmaşık geçiş tanımlarını uygulama kodunuzdan ayırmak için de kullanışlıdır.

Bir kaynak dosyasında yerleşik geçiş belirtmek için aşağıdaki adımları uygulayın:

  • res/transition/ dizinini projenize ekleyin.
  • Bu dizinde yeni bir XML kaynak dosyası oluşturun.
  • Yerleşik geçişlerden biri için bir XML düğümü ekleyin.

Örneğin, aşağıdaki kaynak dosyası Fade geçişini belirtir:

res/transition/fade_transition.xml

<fade xmlns:android="http://schemas.android.com/apk/res/android" />

Aşağıdaki kod snippet'inde, etkinliğinizdeki bir Transition örneğinin kaynak dosyasından nasıl genişletileceği gösterilmektedir:

Kotlin

var fadeTransition: Transition =
    TransitionInflater.from(this)
                      .inflateTransition(R.transition.fade_transition)

Java

Transition fadeTransition =
        TransitionInflater.from(this).
        inflateTransition(R.transition.fade_transition);

Kodunuzda geçiş örneği oluşturma

Bu teknik, kodunuzda kullanıcı arayüzünü değiştirirseniz geçiş nesnelerini dinamik olarak oluşturmak ve az sayıda veya hiç parametre içermeyen basit yerleşik geçiş örnekleri oluşturmak için kullanışlıdır.

Yerleşik bir geçişin örneğini oluşturmak için Transition sınıfının alt sınıflarındaki genel oluşturuculardan birini çağırın. Örneğin, aşağıdaki kod snippet'i Fade geçişinin bir örneğini oluşturur:

Kotlin

var fadeTransition: Transition = Fade()

Java

Transition fadeTransition = new Fade();

Geçiş uygulama

Genellikle, kullanıcı işlemi gibi bir etkinliğe yanıt olarak farklı görünüm hiyerarşileri arasında geçiş yapmak için geçiş uygularsınız. Örneğin, bir arama uygulamasını ele alalım: Kullanıcı bir arama terimi girip arama düğmesine dokunduğunda uygulama, sonuçların yerleşimini temsil eden bir sahneye geçerken arama düğmesini silen ve arama sonuçlarını gösteren bir geçiş uygular.

Etkinliğinizdeki bir etkinliğe yanıt olarak geçiş uygularken sahne değişikliği yapmak için aşağıdaki snippet'te gösterildiği gibi, TransitionManager.go() sınıf işlevini biten sahne ve animasyon için kullanılacak geçiş örneğiyle birlikte çağırın:

Kotlin

TransitionManager.go(endingScene, fadeTransition)

Java

TransitionManager.go(endingScene, fadeTransition);

Çerçeve, geçiş örneği tarafından belirtilen animasyonu çalıştırırken sahne kökünün içindeki görünüm hiyerarşisini, bitiş sahnesindeki görünüm hiyerarşisiyle değiştirir. Başlangıç sahnesi, son geçişin bitiş sahnesidir. Önceki bir geçiş yoksa başlangıç sahnesi, kullanıcı arayüzünün mevcut durumundan otomatik olarak belirlenir.

Bir geçiş örneği belirtmezseniz geçiş yöneticisi, çoğu durumda makul bir işlem yapan otomatik bir geçiş uygulayabilir. Daha fazla bilgi için TransitionManager sınıfının API referansına bakın.

Belirli hedef görünümleri seçme

Çerçeve, başlangıç ve bitiş sahnelerindeki tüm görünümlere varsayılan olarak geçişler uygular. Bazı durumlarda, bir sahnedeki görünümlerin yalnızca bir alt kümesine animasyon uygulamak isteyebilirsiniz. Bu çerçeve, animasyon eklemek istediğiniz belirli görünümleri seçmenize olanak tanır. Örneğin, çerçeve ListView nesnelerindeki değişikliklerin animasyonunu desteklemez. Bu nedenle, geçiş sırasında bu nesneleri canlandırmaya çalışmayın.

Geçişin animasyon uyguladığı her görünüme hedef adı verilir. Yalnızca bir sahneyle ilişkili görünüm hiyerarşisinin parçası olan hedefleri seçebilirsiniz.

Hedefler listesinden bir veya daha fazla görünümü kaldırmak için geçişi başlatmadan önce removeTarget() yöntemini çağırın. Hedefler listesine yalnızca belirttiğiniz görünümleri eklemek için addTarget() işlevini çağırın. Daha fazla bilgi için Transition sınıfının API referansına bakın.

Birden fazla geçiş belirtme

Animasyondan en iyi şekilde yararlanmak için animasyonu sahneler arasında gerçekleşen değişiklik türüyle eşleştirin. Örneğin, bazı görünümleri kaldırıp sahneler arasına başka görünümler ekliyorsanız karartma veya açma animasyonu, bazı görünümlerin artık kullanılamadığını belirgin bir şekilde gösterir. Görünümleri ekranda farklı noktalara taşıyorsanız kullanıcıların görünümlerin yeni konumunu fark etmesi için hareketi canlandırmanız daha iyi olur.

Geçişler çerçevesi, animasyon efektlerini bir grup yerleşik veya özel geçiş içeren bir geçiş kümesinde birleştirmenize olanak tanıdığından yalnızca bir animasyon seçmeniz gerekmez.

XML'deki bir geçiş koleksiyonundan geçiş kümesi tanımlamak için res/transitions/ dizininde bir kaynak dosyası oluşturun ve geçişleri TransitionSet öğesi altında listeleyin. Örneğin, aşağıdaki snippet'te AutoTransition sınıfıyla aynı davranışa sahip bir geçiş kümesinin nasıl belirtileceği gösterilmektedir:

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
    android:transitionOrdering="sequential">
    <fade android:fadingMode="fade_out" />
    <changeBounds />
    <fade android:fadingMode="fade_in" />
</transitionSet>

Geçiş kümesini kodunuzda TransitionSet nesnesine dönüştürmek için etkinliğinizdeki TransitionInflater.from() işlevini çağırın. TransitionSet sınıfı, Transition sınıfından türetilir. Bu nedenle, diğer Transition örneklerinde olduğu gibi geçiş yöneticisiyle birlikte kullanabilirsiniz.

Sahneler olmadan geçiş uygulama

Görünüm hiyerarşilerini değiştirmek, kullanıcı arayüzünüzü değiştirmenin tek yolu değildir. Ayrıca, mevcut hiyerarşide alt görünümler ekleyerek, değiştirerek ve kaldırarak da değişiklik yapabilirsiniz.

Örneğin, tek bir düzene sahip bir arama etkileşimi uygulayabilirsiniz. Arama giriş alanı ve arama simgesi gösteren düzenle başlayın. Kullanıcı arayüzünü sonuçları gösterecek şekilde değiştirmek için kullanıcı arama düğmesine dokunduğunda ViewGroup.removeView() işlevini çağırarak arama düğmesini kaldırın ve ViewGroup.addView() işlevini çağırarak arama sonuçlarını ekleyin.

Alternatif olarak neredeyse aynı iki hiyerarşiye sahip olmak istemiyorsanız bu yaklaşımı kullanabilirsiniz. Kullanıcı arayüzündeki küçük bir fark için iki ayrı düzen dosyası oluşturup bunları korumak yerine, kodda değiştirdiğiniz bir görünüm hiyerarşisi içeren tek bir düzen dosyası kullanabilirsiniz.

Mevcut görünüm hiyerarşisinde bu şekilde değişiklik yaparsanız sahne oluşturmanız gerekmez. Bunun yerine, gecikmeli geçiş kullanarak bir görünüm hiyerarşisinin iki durumu arasında geçiş oluşturup uygulayabilirsiniz. Geçişler çerçevesinin bu özelliği, mevcut görünüm hiyerarşisi durumuyla başlar, görünümlerinde yaptığınız değişiklikleri kaydeder ve sistem kullanıcı arayüzünü yeniden çizdiğinde değişiklikleri canlandıran bir geçiş uygular.

Tek bir görünüm hiyerarşisinde gecikmeli geçiş oluşturmak için aşağıdaki adımları uygulayın:

  1. Geçişi tetikleyen etkinlik gerçekleştiğinde, değiştirmek istediğiniz tüm görünümlerin üst görünümünü ve kullanılacak geçişi sağlayarak TransitionManager.beginDelayedTransition() işlevini çağırın. Çerçeve, alt görünümlerin mevcut durumunu ve özellik değerlerini depolar.
  2. Çocuk görünümlerinde kullanım alanınıza göre gerekli değişiklikleri yapın. Çerçeve, alt görünümlerde ve bunların özelliklerinde yaptığınız değişiklikleri kaydeder.
  3. Sistem, kullanıcı arayüzünü değişikliklerinize göre yeniden çizdiğinde çerçeve, orijinal durum ile yeni durum arasındaki değişiklikleri animasyonla gösterir.

Aşağıdaki örnekte, gecikmeli geçiş kullanarak bir görünüm hiyerarşisine metin görünümü ekleme işleminin nasıl animasyonla gösterileceği açıklanmaktadır. İlk snippet'te düzen tanımı dosyası gösterilmektedir:

res/layout/activity_main.xml

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/mainLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <EditText
        android:id="@+id/inputText"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />
    ...
</androidx.constraintlayout.widget.ConstraintLayout>

Aşağıdaki snippet'te, metin görünümünün eklenmesini canlandıran kod gösterilmektedir:

MainActivity

Kotlin

setContentView(R.layout.activity_main)
val labelText = TextView(this).apply {
    text = "Label"
    id = R.id.text
}
val rootView: ViewGroup = findViewById(R.id.mainLayout)
val mFade: Fade = Fade(Fade.IN)
TransitionManager.beginDelayedTransition(rootView, mFade)
rootView.addView(labelText)

Java

private TextView labelText;
private Fade mFade;
private ViewGroup rootView;
...
// Load the layout.
setContentView(R.layout.activity_main);
...
// Create a new TextView and set some View properties.
labelText = new TextView(this);
labelText.setText("Label");
labelText.setId(R.id.text);

// Get the root view and create a transition.
rootView = (ViewGroup) findViewById(R.id.mainLayout);
mFade = new Fade(Fade.IN);

// Start recording changes to the view hierarchy.
TransitionManager.beginDelayedTransition(rootView, mFade);

// Add the new TextView to the view hierarchy.
rootView.addView(labelText);

// When the system redraws the screen to show this update,
// the framework animates the addition as a fade in.

Geçiş yaşam döngüsü geri çağırmalarını tanımlama

Geçiş yaşam döngüsü, etkinlik yaşam döngüsüne benzer. Bu, TransitionManager.go() işlevine yapılan çağrı ile animasyonun tamamlanması arasındaki dönemde çerçevenin izlediği geçiş durumlarını gösterir. Çerçeve, önemli yaşam döngüsü durumlarında TransitionListener arayüzü tarafından tanımlanan geri çağırmaları çağırır.

Geçiş yaşam döngüsü geri çağırmaları, örneğin sahne değişikliği sırasında başlangıçtaki görünüm hiyerarşisinden bitişteki görünüm hiyerarşisine bir görünüm özelliği değerini kopyalamak için kullanışlıdır. Geçiş tamamlanana kadar bitiş görünümü hiyerarşisi genişletilmediğinden değeri başlangıç görünümünden bitiş görünümü hiyerarşisindeki görünüme kopyalamanız yeterli olmaz. Bunun yerine, değeri bir değişkende depolamanız ve çerçeve geçişi tamamladığında değeri bitiş görünümü hiyerarşisine kopyalamanız gerekir. Geçiş tamamlandığında bildirim almak için etkinliğinizde TransitionListener.onTransitionEnd() işlevini uygulayın.

Daha fazla bilgi için TransitionListener sınıfının API referansına bakın.

Sınırlamalar

Bu bölümde, geçiş çerçevesinin bilinen bazı sınırlamaları listelenmiştir:

  • SurfaceView öğesine uygulanan animasyonlar doğru görünmeyebilir. SurfaceView örnekleri, kullanıcı arayüzü olmayan bir iş parçacığından güncellendiğinden güncellemeler, diğer görünümlerin animasyonlarıyla senkronize olmayabilir.
  • Belirli geçiş türleri, TextureView uygulandığında istenen animasyon efektini oluşturmayabilir.
  • AdapterView gibi genişletilmiş sınıflar ListView, çocuk görünümlerini geçiş çerçevesiyle uyumsuz şekilde yönetir. AdapterView temelinde bir görünümü canlandırmaya çalışırsanız cihaz ekranı yanıt vermeyi durdurabilir.
  • Animasyon içeren bir TextView öğesini yeniden boyutlandırmaya çalıştığınızda, nesne tamamen yeniden boyutlandırılmadan önce metin yeni bir konuma taşınıyor. Bu sorunu önlemek için metin içeren görünümlerin yeniden boyutlandırılmasını animasyonlu hale getirmeyin.