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

"Oluştur" yöntemini deneyin
Jetpack Compose, Android için önerilen kullanıcı arayüzü araç setidir. Oluşturma'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ızı sağlar. Ne tür bir animasyon istediğinizi (ör. görünümlerin azaltılıp azaltılmasını veya görünüm boyutlarını değiştirmek) seçebilirsiniz. Geçiş çerçevesi, başlangıç düzeninden bitiş düzenine kadar animasyonun nasıl yapılacağı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 uygular.
  • Yerleşik animasyonlar: Kararma veya hareket gibi yaygın efektler için önceden tanımlanmış animasyonları kullanın.
  • Kaynak dosyası desteği: Düzen kaynak dosyalarından yükleme görünümü hiyerarşileri ve yerleşik animasyonlar.
  • 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 yapan örnek kod için BasicTransition bölümüne bakın.

İki düzen arasında animasyon oluşturmak için temel süreç aşağıdaki gibidir:

  1. Başlangıç ve bitiş düzenleri için bir Scene nesnesi oluşturun. Bununla birlikte, başlangıç düzeninin sahnesi genellikle geçerli düzene göre otomatik olarak belirlenir.
  2. İstediğiniz animasyon türünü tanımlamak için bir Transition nesnesi oluşturun.
  3. TransitionManager.go() çağrısı yapılır ve sistem, düzenleri değiştirmek için animasyonu çalıştırır.

Şekil 1'deki şemada 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ğunu gösteren basit bir görsel.

Sahne oluşturma

Sahneler, tüm görünümleri ve özellik değerleri dahil olmak üzere bir görünüm hiyerarşisinin durumunu depolar. Geçiş ç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 geçerli kullanıcı arayüzünden otomatik olarak belirlenir.

Bir sahne, bir sahne değişikliği yaptığınızda yürütülen 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ğından sahne oluşturma

Doğrudan bir düzen kaynak 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, görünüm hiyerarşisinin Scene örneğini oluşturduğunuz sıradaki durumunu temsil eder. Görünüm hiyerarşisini değiştirirseniz sahneyi yeniden oluşturun. Çerçeve, dosyadaki tüm görünüm hiyerarşisinden sahne oluşturur. Bir düzen dosyasının parçasından sahne oluşturamazsınız.

Bir düzen kaynak dosyasından Scene örneği oluşturmak için düzeninizden 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 birlikte Scene.getSceneForLayout() işlevini çağırın.

Sahne düzenlerini tanımlayın

Bu bölümün geri kalanındaki kod snippet'leri, aynı sahne kök öğesine sahip iki farklı sahnenin nasıl oluşturulacağını göstermektedir. Snippet'ler, birbirleriyle ilişkili olduklarını ima etmeden birden fazla alakasız Scene nesnesi yükleyebileceğinizi de gösterir.

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

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

Örnek, animasyonun tamamının 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çerir. İlk sahnenin düzeni, ana düzen dosyasına eklenir. Bu sayede uygulama, çerçeveyi bir sahneye yalnızca düzen dosyasının tamamını yükleyebileceğinden bu resim, ilk kullanıcı arayüzünün bir parçası olarak görüntüleyebilir ve aynı zamanda bunu bir sahneye yükleyebilir.

İlk sahnenin düzeni şu ş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" >
    
    
</androidx.constraintlayout.widget.ConstraintLayout>

İkinci sahnenin düzeni, aynı kimliklerle farklı bir sırada düzenlenmiş aynı iki metin alanını içerir. Aşağıdaki ş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" >
    
    
</androidx.constraintlayout.widget.ConstraintLayout>

Düzenlerden sahne oluştur

İki kısıtlama düzeninin tanımlarını oluşturduktan sonra, her biri için bir sahne oluşturabilirsiniz. Bu, iki kullanıcı arayüzü yapılandırması arasında geçiş yapmanızı sağlar. Bir sahneyi almak için sahne köküne ve düzen kaynak kimliğine referans vermeniz gerekir.

Aşağıdaki kod snippet'i, sahne köküne referansın nasıl alınacağını ve düzen dosyalarından iki Scene nesnesinin nasıl oluşturulduğunu gösterir:

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 nesnesi var. Her iki sahne de res/layout/activity_main.xml içindeki FrameLayout öğesi tarafından tanımlanan sahne kökünü kullanır.

Kodunuzda bir sahne oluşturma

Ayrıca, kodunuzda bir ViewGroup nesnesinden Scene örneği oluşturabilirsiniz. Bu tekniği, görünüm hiyerarşilerini doğrudan kodunuzda değiştirirken veya dinamik olarak oluştururken kullanın.

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

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

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

Çerçeve, sistemin bir sahneye girerken veya sahneden çıkarken çalıştıracağı özel sahne eylemleri tanımlamanızı sağlar. Çerçeve, sahneler arasındaki değişikliği otomatik olarak canlandırdığı için çoğu durumda özel sahne eylemlerini tanımlamak gerekli değildir.

Sahne işlemleri, şu durumları ele almak için yararlıdır:

  • Aynı hiyerarşide olmayan görünümlere animasyon eklemek için. Çıkış ve giriş sahnesi işlemlerini kullanarak başlangıç ve bitiş sahneleri için görünümleri canlandırabilirsiniz.
  • Geçiş çerçevesinin otomatik olarak canlandırılamayacağı görünümleri (ör. ListView nesneleri) canlandırmak için. Daha fazla bilgi edinmek için sınırlamalar ile ilgili bölümü inceleyin.

Özel sahne işlemleri sağlamak için işlemlerinizi Runnable nesneleri olarak tanımlayın ve 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 bitiş sahnesinde setEnterAction() işlevini çağırır.

Geçiş uygulama

Geçiş çerçevesi, Transition nesnesi bulunan sahneler arasındaki animasyonun stilini temsil eder. AutoTransition ve Fade gibi yerleşik alt sınıfları kullanarak bir Transition örneği oluşturabilir veya kendi geçişinizi tanımlayabilirsiniz. Daha sonra, son Scene ve Transition öğesini TransitionManager.go() öğesine geçirerek sahneler arasında animasyonu çalıştırabilirsiniz.

Geçiş yaşam döngüsü, etkinlik yaşam döngüsüne benzerdir ve çerçevenin bir animasyonun başlangıcı ile tamamlanması arasında izlediği geçiş durumlarını temsil eder. Önemli yaşam döngüsü durumlarında çerçeve, kullanıcı arayüzünüzü geçişin farklı aşamalarında 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. Geçiş yapmak istediğiniz başlangıç ve bitiş sahnelerini tanımladıktan sonra animasyonu tanımlayan bir Transition nesnesi oluşturun. Çerçeve, bir kaynak dosyasında yerleşik bir geçiş belirtmenizi ve bunu kodunuzda artırmanızı veya doğrudan kodunuzda yerleşik bir geçiş örneği oluşturmanızı sağlar.

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

Sınıf Etiketle Etki
AutoTransition <autoTransition/> Varsayılan geçiş. Bu sırada soluklaşır, hareket eder, yeniden boyutlandırılır ve görünümlerde soluklaşır.
ChangeBounds <changeBounds/> Görünümleri taşır ve yeniden boyutlandırır.
ChangeClipBounds <changeClipBounds/> Sahne değişikliğinden önceki ve sonraki View.getClipBounds() görüntüsünü yakalar ve geçiş sırasında bu değişiklikleri canlandırır.
ChangeImageTransform <changeImageTransform/> Sahne değişiminden önceki ve sonraki ImageView matrisini yakalar ve geçiş sırasında animasyon oluşturur.
ChangeScroll <changeScroll/> Sahne değişikliğinden önceki ve sonraki hedeflerin kaydırma özelliklerini yakalar ve tüm değişiklikleri canlandırır.
ChangeTransform <changeTransform/> Sahne değişiminden önceki ve sonraki görünümlerin ölçeğini ve dönüşünü yakalar ve geçiş sırasında bu değişiklikleri canlandırır.
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 veya kenarlarına taşır.
Fade <fade/> fade_in, görüntülemelerde yavaşça gözden geçirilir.
fade_out, görünümleri kademeli olarak azaltır.
fade_in_out (varsayılan), fade_out ve ardından bir fade_in yapar.
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üntülemeleri sahnenin kenarlarından birinin içine veya dışına taşır.

Kaynak dosyadan geçiş örneği oluşturma

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

Bir kaynak dosyasında yerleşik bir geçiş belirtmek için şu adımları uygulayın:

  • res/transition/ dizinini projenize ekleyin.
  • Bu dizin içinde yeni bir XML kaynak dosyası oluşturun.
  • Yerleşik geçişlerden biri için 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'i, bir kaynak dosyasından etkinliğinizin içindeki bir Transition örneğini nasıl şişireceğinizi gösterir:

Kotlin

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

Java

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

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

Bu teknik, kodunuzdaki kullanıcı arayüzünü değiştirirseniz ve çok az parametreyle ya da hiç parametreyle basit yerleşik geçiş örnekleri oluşturursanız geçiş nesnelerini dinamik olarak oluşturmak için yararlıdır.

Yerleşik geçiş örneği oluşturmak için Transition sınıfının alt sınıflarındaki genel kuruculardan 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 bir geçiş uygularsınız. Örneğin, bir arama uygulaması düşünelim: Kullanıcı bir arama terimi girip arama düğmesine dokunduğunda uygulama, arama düğmesini soluklaştıran ve arama sonuçlarında çıkan bir geçiş uygularken sonuç düzenini temsil eden bir sahneye dönüşür.

Etkinliğinizdeki bir etkinliğe yanıt olarak geçiş uygularken sahne değişikliği yapmak istiyorsanız aşağıdaki snippet'te gösterildiği gibi bitiş sahnesiyle birlikte TransitionManager.go() sınıf işlevini ve animasyon için kullanılacak geçiş örneğini ç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 bitiş sahnesindeki görünüm hiyerarşisiyle sahne kökü içindeki görünüm hiyerarşisini değiştirir. Başlangıç sahnesi, son geçişteki bitiş sahnesidir. Daha önce bir geçiş yoksa başlangıç sahnesi, kullanıcı arayüzünün geçerli durumundan otomatik olarak belirlenir.

Bir geçiş örneği belirtmezseniz geçiş yöneticisi, çoğu durum için 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çin

Çerçeve, geçişleri varsayılan olarak başlangıç ve bitiş sahnelerindeki tüm görünümlere uygular. Bazı durumlarda, bir sahnedeki görünümlerin yalnızca bir alt kümesine animasyon uygulamak isteyebilirsiniz. Çerçeve, animasyon eklemek istediğiniz belirli görünümleri seçmenize olanak tanır. Örneğin, çerçeve ListView nesnelerinde animasyon oluşturmayı desteklemez. Bu nedenle, geçiş sırasında bunları animasyona dahil etmeye çalışmayın.

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

Bir veya daha fazla görünümü hedef listesinden kaldırmak için geçişi başlatmadan önce removeTarget() yöntemini çağırın. Yalnızca belirttiğiniz görünümleri hedef listesine 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

Bir animasyondan en yüksek etkiyi elde etmek için animasyonu, sahneler arasında gerçekleşen değişiklik türüyle eşleştirin. Örneğin, sahneler arasına bazı görünümleri kaldırıyor ve başka öğeler ekliyorsanız animasyonda kaybolma veya şeffaflaşma, bazı görünümlerin artık kullanılamadığına dair fark edilir bir işaret sağlar. Görünümleri ekrandaki farklı noktalara taşıyorsanız kullanıcıların görüntülemelerin yeni konumunu fark etmeleri için hareketi canlandırmak daha iyi olur.

Geçişler çerçevesi, bağımsız veya özel geçişlerden oluşan bir grup içeren geçiş kümelerinde animasyon efektlerini birleştirmenize olanak tanıdığından yalnızca bir animasyon seçmeniz gerekmez.

XML'deki bir geçiş koleksiyonundan bir geçiş grubu 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, AutoTransition sınıfıyla aynı davranışa sahip bir geçiş grubunun nasıl belirtileceğini gösterir:

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

Kodunuzda TransitionSet nesnesine ayarlanan geçişi artırmak için etkinliğinizde TransitionInflater.from() işlevini çağırın. TransitionSet sınıfı Transition sınıfını kapsar. Dolayısıyla bu sınıfı, diğer Transition örneklerinde olduğu gibi bir geçiş yöneticisiyle kullanabilirsiniz.

Sahne olmadan geçiş uygula

Görünüm hiyerarşilerini değiştirmek, kullanıcı arayüzünüzde değişiklik yapmanın tek yolu değildir. Ayrıca, geçerli hiyerarşiye alt görünümler ekleyerek, bunları değiştirerek ve kaldırarak da değişiklik yapabilirsiniz.

Örneğin, tek bir düzenle bir arama etkileşimi uygulayabilirsiniz. Arama girişi alanı ve arama simgesi bulunan düzenle başlayın. Sonuçları gösterecek şekilde kullanıcı arayüzünü değiştirmek istiyorsanız kullanıcı 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 istiyorsanız bu yaklaşımı kullanabilirsiniz. Kullanıcı arayüzünde küçük bir farklılık için iki ayrı düzen dosyası oluşturup yönetmek yerine, kodda değiştirdiğiniz bir görünüm hiyerarşisini içeren bir düzen dosyanız olabilir.

Geçerli 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 bir geçiş oluşturabilir ve 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 görünüm hiyerarşisinde gecikmeli geçiş oluşturmak için aşağıdaki adımları izleyin:

  1. Geçişi tetikleyen etkinlik gerçekleştiğinde, değiştirmek istediğiniz tüm görünümlerin ve kullanılacak geçişin üst görünümünü sağlayarak TransitionManager.beginDelayedTransition() işlevini çağırın. Çerçeve, alt görünümlerin mevcut durumunu ve mülk değerlerini depolar.
  2. Alt görünümlerde, kullanım alanınızın gerektirdiği değişiklikleri yapın. Çerçeve, alt görünümlerde ve mülklerinde 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şikliklerin animasyonunu gösterir.

Aşağıdaki örnekte, gecikmeli geçiş kullanılarak görünüm hiyerarşisine metin görünümü ekleme işleminin nasıl canlandırılacağı gösterilmektedir. İlk snippet, düzen tanımı dosyasını gösterir:

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>

Sonraki snippet, metin görünümünün eklenmesiyle animasyon oluşturan kodu gösterir:

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ımlayın

Geçiş yaşam döngüsü, etkinlik yaşam döngüsüne benzer. Bu, TransitionManager.go() işlevine yapılan bir çağrı ile animasyonun tamamlanması arasındaki süre boyunca çerçevenin izlediği geçiş durumlarını gösterir. Önemli yaşam döngüsü durumlarında çerçeve, 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 bir sahne değişikliği sırasında başlangıç görünümü hiyerarşisinden bitiş görünümü hiyerarşisine bir görünüm özelliği değerinin kopyalanmasında yararlıdır. Bitiş görünümü hiyerarşisi, geçiş tamamlanana kadar şişirilmediğinden, değeri başlangıç görünümünden bitiş görünümü hiyerarşisindeki görünüme kopyalayamazsınız. Bunun yerine, değeri bir değişkende depolamanız ve çerçevenin geçişi tamamladığında bunu 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çevesiyle ilgili bilinen bazı sınırlamalar listelenmiştir:

  • SurfaceView öğesine uygulanan animasyonlar doğru şekilde görünmeyebilir. SurfaceView örneği, 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.
  • Bazı belirli geçiş türleri, TextureView öğesine uygulandığında istenen animasyon efektini üretmeyebilir.
  • AdapterView kapsamını genişleten ListView gibi sınıflar, çocuk görüntülemelerini geçiş çerçevesiyle uyumlu olmayan şekillerde yönetir. Bir görünümü AdapterView temelinde animasyon haline getirmeye çalışırsanız cihaz ekranı yanıt vermeyi durdurabilir.
  • Bir TextView öğesini animasyonlu yeniden boyutlandırmaya çalışırsanız nesne tamamen yeniden boyutlandırılmadan önce metin yeni bir konuma açılır. Bu sorunu önlemek için, metin içeren görünümlerin yeniden boyutlandırmasıyla ilgili animasyon uygulamayın.