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

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

Android'in geçiş çerçevesi, başlangıç ve bitiş düzenlerini sağlayarak kullanıcı arayüzünde her tür hareketi canlandırmanıza olanak tanır. Ne tür bir animasyon istediğinizi seçebilirsiniz (örneğin, görünümlerin karartılması veya kapanması ya da görünüm boyutlarını değiştirmek) ve geçiş çerçevesi, başlangıç düzeninden bitiş düzenine nasıl animasyon yapılacağını belirler.

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

  • Grup düzeyinde animasyonlar: Animasyon efektlerini görünüm hiyerarşisindeki tüm görünümlere uygular.
  • Yerleşik animasyonlar: Uygulamada kararma 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 düzen kaynak dosyalarındaki yerleşik animasyonları yükleme.
  • 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 uygulayan örnek kod için BasicTransition bölümüne 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 düzeni genellikle geçerli düzene göre otomatik olarak belirlenir.
  2. Ne tür bir animasyon istediğinizi tanımlamak için bir Transition nesnesi oluşturun.
  3. TransitionManager.go() yöntemini çağırdığınızda sistem, düzenleri değiştirmek için animasyonu çalıştırır.

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

Şekil 1. Geçiş çerçevesinin nasıl animasyon oluşturduğunu gösteren basit 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ş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 geçerli kullanıcı arayüzünden otomatik olarak belirlenir.

Bir sahne, bir sahne değişikliği yaptığınızda gerçekleştirilecek kendi işlemlerini de tanımlayabilir. Bu özellik, bir sahneye geçiş yaptıktan sonra görünüm ayarlarını temizlemek için yararlıdır.

Düzen kaynağından sahne oluşturma

Doğrudan bir düzen kaynak dosyasından Scene örneği oluşturabilirsiniz. Bu tekniği, dosyadaki görünüm hiyerarşisi büyük ölçüde statikse kullanın. Ortaya çıkan sahne, Scene örneğini oluşturduğunuz sıradaki görünüm hiyerarşisinin durumunu temsil eder. Görünüm hiyerarşisini değiştirirseniz sahneyi yeniden oluşturun. Çerçeve, dosyada tüm görünüm hiyerarşisinden sahneyi oluşturur. Bir düzen dosyasının bir bölümünden sahne oluşturamazsınız.

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

Sahneler için düzenleri tanımlama

Bu bölümün geri kalanındaki kod snippet'lerinde, aynı sahne kök öğesiyle nasıl iki farklı sahnenin nasıl oluşturulacağı gösterilmektedir. Snippet'ler, birbiriyle ilişkili olduklarını belirtmeden birden çok 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 ConstraintLayout.
  • İkinci sahne için aynı iki metin alanı farklı sırada olan bir ConstraintLayout.

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

Etkinliğin ana düzeni aşağıdaki gibi 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 düzen kökü için bir alt FrameLayout içerir. İlk sahnenin düzeni, ana düzen dosyasına eklenir. Böylece, çerçeve bir sahneye yalnızca tüm düzen dosyasını yükleyebildiği için, uygulamanın bunu ilk kullanıcı arayüzünün parçası olarak görüntülemesine ve ayrıca sahneye yüklemesine olanak tanır.

İ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 sahne düzeni, farklı bir sırada yerleştirilmiş aynı kimliklere sahip 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üzenlerlerden sahne oluştur

İki sınırlama düzeni için tanım oluşturduktan sonra bunların her biri için bir düzen elde edebilirsiniz. Bu, iki kullanıcı arayüzü yapılandırması arasında geçiş yapmanızı sağlar. Bir sahneyi elde etmek için sahne köküne ve düzen kaynağı 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şturulacağını 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 bulunur. 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

Kodunuzda bir ViewGroup nesnesinden Scene örneği de oluşturabilirsiniz. Görünüm hiyerarşilerini doğrudan kodunuzda değiştirirken veya dinamik olarak oluştururken bu tekniği kullanın.

Kodunuzdaki görünüm hiyerarşisinden bir 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şken 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östermektedir:

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

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

Sahne işlemleri, aşağıdaki durumların ele alınmasında yararlıdır:

  • Aynı hiyerarşide olmayan görünümleri canlandırmak 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ıramadığı görünümleri (ör. ListView nesneleri) canlandırmak için. Daha fazla bilgi için sınırlamalar hakkındaki bölüme bakın.

Ö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 ve 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 içeren 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. Ardından, son Scene ve Transition öğelerini TransitionManager.go() öğesine geçirerek animasyonu sahneler arasında ç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, 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. Aralarında geçiş yapmak istediğiniz başlangıç ve bitiş sahnelerini tanımladıktan sonra, animasyonu tanımlayan bir Transition nesnesi oluşturun. Çerçeve, kaynak dosyasında yerleşik bir geçiş belirtmenize ve bunu kodunuzda şişirmenize veya doğrudan kodunuzda yerleşik geçiş örneği oluşturmanıza olanak tanır.

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

Sınıf Etiketle Etki
AutoTransition <autoTransition/> Varsayılan geçiş. Belirtilen sırayla kararır, hareket eder, yeniden boyutlandırılır ve görünümlerde kararır.
ChangeBounds <changeBounds/> Görünümleri taşır ve yeniden boyutlandırır.
ChangeClipBounds <changeClipBounds/> Sahne değişiminden önceki ve sonraki View.getClipBounds() görüntülerini yakalar ve geçiş sırasında bu değişikliklere animasyon ekler.
ChangeImageTransform <changeImageTransform/> Sahne değişiminden önceki ve sonraki ImageView matrisini yakalar ve geçiş sırasında animasyona dahil eder.
ChangeScroll <changeScroll/> Sahne değişiminden önce ve sonra hedeflerin kaydırma özelliklerini yakalar ve tüm değişikliklere animasyon uygular.
ChangeTransform <changeTransform/> Sahne değişiminden önceki ve sonraki görünümlerin ölçeğini ve dönüşünü kaydeder ve geçiş sırasında bu değişikliklere animasyon ekler.
Explode <explode/> Başlangıç ve bitiş sahnelerinde hedef görüntülemelerin görünürlüğünde yapılan değişiklikleri izler ve görüntülemeleri sahnenin kenarlarının içine veya dışına taşır.
Fade <fade/> fade_in, görüntüleme sayısında düşüş var.
fade_out, arka plan rengini azaltır.
fade_in_out (varsayılan), fade_out ve ardından fade_in yapar.
Slide <slide/> Başlangıç ve bitiş sahnelerinde hedef görüntülemelerin görünürlüğünde yapılan değişiklikleri izler ve görünümleri 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ştirmenize olanak tanır. Bu teknik, birden çok geçiş belirtme hakkındaki bölümde gösterildiği gibi, karmaşık geçiş tanımlarını uygulama kodunuzdan ayırmak için de kullanışlıdır.

Bir kaynak dosyada yerleşik geçiş belirtmek için şu adımları izleyin:

  • res/transition/ dizinini projenize ekleyin.
  • Bu dizin içinde 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'i, bir kaynak dosyadaki etkinliğinizin içinde 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 geçiş nesnelerini dinamik olarak oluşturmak ve az sayıda parametre içeren ya da hiç parametre içermeyen basit yerleşik geçiş örnekleri oluşturmak için yararlıdır.

Yerleşik geçişin bir örneğini 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üşünün: Kullanıcı bir arama terimi girip arama düğmesine dokunduğunda, uygulama, sonuç düzenini temsil eden bir sahneye dönüşürken arama düğmesinin karartıldığı ve arama sonuçlarında kararan bir geçiş uygulanır.

Etkinliğinizdeki bir etkinliğe yanıt olarak geçiş uygularken sahne değişikliği yapmak için TransitionManager.go() sınıf işlevini, aşağıdaki snippet'te gösterildiği gibi bitiş sahnesi 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ğinin belirttiği animasyonu çalıştırırken sahne kökü içindeki görünüm hiyerarşisini bitiş sahnedeki görünüm hiyerarşisiyle değiştirir. Başlangıç sahnesi, son geçişten itibaren bitiş sahnesidir. Daha önce herhangi 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 durum için makul bir işlem yapan otomatik geçiş uygulayabilir. Daha fazla bilgi için TransitionManager sınıfıyla ilgili API referansına bakın.

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

Çerçeve, varsayılan olarak başlangıç ve bitiş sahnelerindeki tüm görüntülemelere geçişler uygular. Bazı durumlarda, bir sahnedeki görüntülemelerin yalnızca bir alt kümesine animasyon uygulamak isteyebilirsiniz. Çerçeve, canlandırmak istediğiniz görünümleri seçebilmenizi sağlar. Örneğin, çerçeve ListView nesnelerinde yapılan değişikliklerin animasyonunu desteklemez. Bu nedenle, geçiş sırasında bunları canlandırmaya çalışmayın.

Geçişin canlandırdığı 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. Hedef 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ıyla ilgili API referansına bakın.

Birden çok geçiş belirtme

Bir animasyondan en iyi etkiyi elde etmek için, sahneleri arasında gerçekleşen değişikliklerin türüyle eşleştirin. Örneğin, bazı görünümleri kaldırıp sahneler arasına başka görüntüler ekliyorsanız animasyonun soluklaşması veya kayması, bazı görüntülemelerin artık kullanılamadığına dair belirgin bir işaret sağlar. Görünümleri ekrandaki farklı noktalara taşıyorsanız, kullanıcıların görünümlerin yeni konumunu fark etmesi için hareketi canlandırmak daha iyi olur.

Geçişler çerçevesi, bağımsız yerleşik veya özel geçişlerden oluşan bir grup içeren bir geçiş grubunda animasyon efektlerini birleştirmenizi sağladığından yalnızca bir animasyon seçmeniz gerekmez.

XML'deki bir geçiş koleksiyonundan 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'te AutoTransition sınıfıyla aynı davranışa sahip bir geçiş grubunun 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>

Ayarlanan geçişi kodunuzda bir TransitionSet nesnesine dönüştürmek için etkinliğinizde TransitionInflater.from() işlevini çağırın. TransitionSet sınıfı Transition sınıfından alınır. Böylece bu sınıfı herhangi bir Transition örneği gibi bir geçiş yöneticisiyle kullanabilirsiniz.

Sahne 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. Mevcut hiyerarşideki alt görünümleri ekleyerek, değiştirerek ve kaldırarak da değişiklik yapabilirsiniz.

Örneğin, tek bir düzenle arama etkileşimi uygulayabilirsiniz. Bir 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ı dokunduğunda arama düğmesini ViewGroup.removeView() işlevini çağırarak kaldırın ve ViewGroup.addView() işlevini çağırarak arama sonuçlarını ekleyin.

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

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 bir geçiş oluşturup uygulayabilirsiniz. Geçiş ç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 şu 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ğlamak için TransitionManager.beginDelayedTransition() işlevini çağırın. Çerçeve, alt görüntülemelerin mevcut durumunu ve özellik 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 özelliklerinde yaptığınız değişiklikleri kaydeder.
  3. Değişiklikleriniz doğrultusunda sistem, kullanıcı arayüzünü yeniden çizdiğinde, çerçeve, orijinal durum ile yeni durum arasındaki değişiklikleri canlandırır.

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 animasyon yapılacağı gösterilmektedir. İlk snippet, düzen tanımlama 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>

Bir sonraki snippet'te, metin görünümü ekleme işlemini canlandıran kod gösterilir:

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 benzerdir. Çerçevenin, TransitionManager.go() işlevine yapılan çağrı ile animasyonun tamamlanması arasındaki süre boyunca izlediği geçiş durumlarını temsil eder. Ö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ı gibi durumlarda 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çeve 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ğinize 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 örnekleri, kullanıcı arayüzü dışındaki 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'e uygulandığında istenen animasyon efektini üretmeyebilir.
  • AdapterView'i genişleten (ListView gibi) sınıflar, alt görünümlerini geçiş çerçevesiyle uyumsuz şekilde yönetir. AdapterView temel alınarak bir görünümü canlandırmaya çalışırsanız cihaz ekranı yanıt vermeyi durdurabilir.
  • Animasyonlu bir TextView boyutunu yeniden boyutlandırmaya çalışırsanız nesne tamamen yeniden boyutlandırılmadan önce metin yeni bir konuma taşınır. Bu sorunu önlemek için metin içeren görünümlerin yeniden boyutlandırılmasına animasyon uygulamayın.