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

"Oluştur" yöntemini deneyin
Android için önerilen kullanıcı arayüzü araç seti Jetpack Compose'dur. Oluşturma'da animasyonları nasıl kullanacağınızı öğrenin.

Android'in geçiş çerçevesi, başlangıç ve bitiş düzenleri sağlayarak kullanıcı arayüzünüzde her türlü hareketi canlandırmanıza olanak tanır. İstediğiniz animasyon türünü (ör. görünümlerin yavaşça açılması veya kapanması ya da görünüm boyutlarının değiştirilmesi) seçebilirsiniz. Geçiş çerçevesi, başlangıçtaki düzenden bitişteki düzene nasıl animasyon uygulanacağını belirler.

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

  • Grup düzeyinde animasyonlar: Bir görüntüleme hiyerarşisindeki tüm görüntülemelere animasyon efektleri uygulayın.
  • Yerleşik animasyonlar: Kararma veya hareket gibi yaygın efektler için önceden tanımlanmış animasyonları kullanın.
  • Kaynak dosyası desteği: Görüntü hiyerarşileri ve yerleşik animasyonları, yerleşim kaynak dosyalarından yükleyin.
  • Yaşam döngüsü geri çağırma işlevleri: Animasyon ve hiyerarşi değişikliği süreci üzerinde kontrol sağlayan geri çağırma işlevleri alın.

Sayfa düzeni değişiklikleri arasında animasyonlu geçiş yapan örnek kod için BasicTransition bölümüne bakın.

İki düzen arasında animasyon oluşturma işleminin temel adımları şunlardır:

  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 bir Transition nesnesi oluşturun.
  3. TransitionManager.go() çağrısı yapın ve sistem, düzenleri değiştirmek için animasyonu çalıştırır.

Şekil 1'deki şema, düzenler, sahneler, geçiş ve nihai animasyon arasındaki ilişkiyi gösterir.

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

Sahne oluşturma

Sahneler, tüm görünümleri ve mülk değerleri dahil olmak üzere bir görünüm hiyerarşisinin durumunu depolar. Geçiş çerçevesi, başlangıç ve bitiş sahnesi 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.

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

Düzen kaynağından sahne oluşturma

Scene örneğini doğrudan bir düzen kaynak dosyasından 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ı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, dosyanın görünüm hiyerarşisinin tamamından sahneyi 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üzeninizdeki sahne kökünü ViewGroup olarak alın. Ardından, sahne kökünü ve sahnenin görünüm hiyerarşisini içeren düzen dosyasının kaynak kimliğini kullanarak Scene.getSceneForLayout() işlevini çağırın.

Sahneler için düzenler tanımlama

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. Bu snippet'ler, birbiriyle alakalı olduklarını belirtmeden 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 öğe içeren bir etkinliğin ana düzeniFrameLayout.
  • İki metin alanı içeren ilk sahne için bir ConstraintLayout.
  • Farklı sıradaki aynı iki metin alanını içeren ikinci sahne için 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 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 sahne kökü için bir alt FrameLayout içerir. İlk sahnenin düzeni ana düzen dosyasına dahil edilir. Bu, uygulamanın bunu ilk kullanıcı arayüzünün bir parçası olarak görüntülemesine ve bir sahneye yüklemesine olanak tanır. Çünkü çerçeve, yalnızca bir düzen dosyasının tamamını 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ı kimliklere sahip iki metin alanını farklı bir sırada yerleştirir. 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ş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 kaynak kimliğine referans vermeniz gerekir.

Aşağıdaki kod snippet'inde, sahne köküne referans almanın ve düzen dosyalarından iki Scene nesnesi oluşturmanın nasıl yapılacağı 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 nesnesi vardır. 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 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 bir görünüm hiyerarşisi üzerinden sahne oluşturmak için Scene(sceneRoot, viewHierarchy) sınıfının kurucusunu kullanın. Bu oluşturucunun çağrılması, bir düzen dosyasını şişirdiğinizde Scene.getSceneForLayout() işlevinin çağrılmasına eşdeğerdir.

Aşağıdaki kod snippet'inde, kodunuzda sahne kök öğesinden ve sahnenin görüntü hiyerarşisindeki bir Scene örneğinin nasıl 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

Ç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 geçişi otomatik olarak canlandırdığı için çoğu durumda özel sahne işlemleri tanımlamak gerekmez.

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ş sahnelerinin görünümlerini canlandırabilirsiniz.
  • Geçiş çerçevesinin otomatik olarak animasyon oluşturamadığı görünümleri (ör. ListView nesneleri) animasyonlu hale getirmek için kullanılır. 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 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 içeren sahneler arasındaki animasyon 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 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 durumlarında 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üntüleme 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 Efekt
AutoTransition <autoTransition/> Varsayılan geçiş. Görünümleri sırasıyla karartır, taşır, yeniden boyutlandırır ve gösterir.
ChangeBounds <changeBounds/> Görünümleri taşır ve yeniden boyutlandırır.
ChangeClipBounds <changeClipBounds/> Sahne değişikliğinden önce ve sonra View.getClipBounds()'yi yakalar ve geçiş sırasında bu değişiklikleri animasyonlu olarak gösterir.
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 önce ve sonra hedeflerin kaydırma özelliklerini yakalar ve değişiklikleri animasyonlu olarak gösterir.
ChangeTransform <changeTransform/> Sahne değişikliğinden önce ve sonra görünümlerin ölçeğini ve dönüşünü yakalar ve geçiş sırasında bu değişiklikleri animasyonlu olarak 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 içeri veya dışarı taşır.
Fade <fade/> fade_in görüntülemelerde yavaş yavaş kaybolur.
fade_out görüntüleme sayısını azaltır.
fade_in_out (varsayılan) bir fade_out'den sonra bir fade_in yapar.
Slide <slide/> Başlangıç ve bitiş sahnelerindeki hedef görünümlerin görünürlüğüyle ilgili değişiklikleri izler ve görünümleri sahnenin kenarlarından birine doğru içeri veya dışarı 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 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 geçiş belirtmek için aşağıdaki 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 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 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 geçiş nesnelerini dinamik olarak oluşturmak ve az sayıda parametre içeren veya parametre içermeyen basit yerleşik geçiş örnekleri oluşturmak için kullanışlıdır.

Yerleşik bir geçiş örneği oluşturmak için Transition sınıfının alt sınıflarındaki herkese açık 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 bir kullanıcı işlemi gibi bir etkinliğe yanıt olarak farklı görüntüleme hiyerarşileri arasında geçiş yapmak için 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 görünen 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 için aşağıdaki snippet'te gösterildiği gibi, bitiş sahnesini ve animasyon için kullanılacak geçiş örneğini içeren TransitionManager.go() sınıf işlevini ç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ü içindeki görünüm hiyerarşisini bitiş sahnesindeki görünüm hiyerarşisi ile 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çme

Çerçeve, varsayılan olarak başlangıç ve bitiş sahnelerindeki tüm görünümlere geçişler uygular. Bazı durumlarda, bir animasyonu yalnızca sahnedeki görünümlerin bir alt kümesine uygulamak isteyebilirsiniz. Ç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 animasyonlu olarak gösterilmesini desteklemez. Bu nedenle, geçiş sırasında bu nesneleri animasyonlu olarak göstermeye çalışmayın.

Geçişin animasyonlu olarak 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ında bazı görünümleri kaldırıp başka görünümler ekliyorsanız kaybolma veya görünmeye başlama animasyonu, bazı görünümlerin artık kullanılamadığını belirgin bir şekilde gösterir. 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'de bir geçiş koleksiyonundan geçiş grubu tanımlamak için res/transitions/ dizininde bir kaynak dosyası oluşturun ve geçişleri TransitionSet öğesinin 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ından türetildiği için diğer tüm Transition örnekleri gibi geçiş yöneticisiyle kullanabilirsiniz.

Sahne olmadan geçiş uygulama

Kullanıcı arayüzünüzü değiştirmenin tek yolu görüntüleme hiyerarşilerini değiştirmektir. 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üzenle arama etkileşimi uygulayabilirsiniz. Arama girişi alanı ve arama simgesi bulunan düzenle başlayın. Kullanıcı arayüzünü sonuçları gösterecek şekilde değiştirmek için ViewGroup.removeView() işlevini çağırarak kullanıcı dokunduğunda 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 fark için iki ayrı düzen dosyası oluşturup yönetmek yerine, kodda değiştirdiğiniz bir görünüm hiyerarşisi 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 geçiş oluşturabilir ve uygulayabilirsiniz. Geçişler çerçevesinin bu özelliği, mevcut görünüm hiyerarşisi durumundan 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 animasyonlu hale getiren bir geçiş uygular.

Tek bir görünüm hiyerarşisi içinde 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 mülk değerlerini depolar.
  2. Alt görünümlerde, kullanım alanınız gereği gereken 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ş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'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>

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ğırma işlevlerini tanımlama

Geçiş yaşam döngüsü, etkinlik yaşam döngüsüne benzer. Bu, çerçevenin TransitionManager.go() işlevine yapılan bir çağrı ile animasyonun tamamlanması arasındaki dönemde 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ğırma işlevleri, örneğin bir sahne değişikliği sırasında bir görüntüleme mülkü değerini başlangıç görüntüleme hiyerarşisindeki bitiş görüntüleme hiyerarşisine kopyalamak için 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 ardından çerçeve geçişi tamamladığında son görüntü 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 ö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'a uygulandığında istenen animasyon efektini oluşturmayabilir.
  • ListView gibi AdapterView'u genişleten sınıflar, alt görünümlerini geçiş çerçevesiyle uyumlu olmayan şekillerde yönetiyor. Bir görünümü AdapterView'e göre animasyonlu hale getirmeyi denerseniz cihaz ekranı yanıt vermeyebilir.
  • Bir TextView öğesini animasyonla 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ırılmasını animasyonlu hale getirmeyin.