MotionLayout içeren bant

Carousel bir öğelerin listesini gösteren özel bant görünümleri oluşturmak için hareket yardımcı nesnesi göz atabileceği bir yer. Bu tür uygulamaları içeren diğer yollarla karşılaştırıldığında bu yardımcı, karmaşık hareket ve boyut değişiklikleri oluşturmanızı sağlar. Carousel için MotionLayout

Carousel widget'ı, başında ve sonunda bulunan listelerin yanı sıra dairesel biçimde de listeleri destekler. bir liste hazırlayabilirsiniz.

MotionLayout ile Carousel işleyiş şekli

Orta öğenin bulunduğu yatay bir Carousel görünümü oluşturmak istediğinizi varsayalım büyütülmüş:

Bu temel düzen, Carousel öğeyi temsil eden çeşitli görünümler içerir:

Aşağıdaki üç durumla bir MotionLayout oluşturun ve bunlara kimlik verin:

  • önceki
  • başlangıç
  • sonraki

start durumu temel düzene karşılık geliyorsa previous durumunda sonraki durumu ise Carousel öğe bir sola kaydırılır ve sağa dokunun.

Örneğin, Şekil 3'teki beş görünümü alın ve başlangıçta B, C ve D görünümleri görünürken A ve E ekranın dışındadır. Ayarla yukarı önceki duruma getirin. Böylece A, B, C ve D konumları B, C, D ve E, görüşler soldan sağa doğru değişti. Sonraki durum tam tersi olmalıdır. B, C, D ve E, A, B konumuna taşınır ve C, D ve görüşler sağdan sola doğruydu. Bu değer şekilde gösterilmektedir 4:

Görüntülemelerin, tam olarak orijinal görüntülemelerin başladığı yerde bitmesi çok önemlidir. Carousel, sonsuz öğe koleksiyonu illüzyonunu verir gerçek görünümleri eski konumlarına geri getirme ancak bunları yeniden başlatma eşleştirmenizi sağlar. Aşağıdaki şemada bu mekanizma gösterilmektedir. Öde dikkat edin: değerler):

Geçişler

Hareket sahnesi dosyanızda tanımlanan bu üç kısıtlama kümesiyle, start ile next arasındaki ileri ve geri geçişler başlangıç ve önceki durumlarını dahil edin. Bir OnSwipe işleyicisini aşağıda gösterildiği gibi bir harekete yanıt olarak geçişleri tetikler örnek:

    <Transition
        motion:constraintSetStart="@id/start"
        motion:constraintSetEnd="@+id/next"
        motion:duration="1000"
        android:id="@+id/forward">
        <OnSwipe
            motion:dragDirection="dragLeft"
            motion:touchAnchorSide="left" />
    </Transition>

    <Transition
        motion:constraintSetStart="@+id/start"
        motion:constraintSetEnd="@+id/previous"
        android:id="@+id/backward">
        <OnSwipe
            motion:dragDirection="dragRight"
            motion:touchAnchorSide="right" />
    </Transition>

Bu temel hareket sahnesi oluşturulduktan sonra düzene bir Carousel yardımcısı ekleyin. ve görünümlere, önceki ve sonraki uygulamanızı uyguladığınız sırayı animasyon ekler.

Carousel yardımcısı için şu özellikleri ayarlayın:

  • app:carousel_firstView: İlk öğeyi temsil eden görünüm Carousel—bu örnekte, C.
  • app:carousel_previousState: önceki öğenin ConstraintSet kimliği durumu.
  • app:carousel_nextState: Sonraki durumun ConstraintSet kimliği.
  • app:carousel_backwardTransition: Transition Başlangıç ile önceki durumlar arasında uygulanan kimlik.
  • app:carousel_forwardTransition: Transition start ve next durumları için kullanılır.

Örneğin, düzen XML dosyanızda şöyle bir şey olsun:

    <androidx.constraintlayout.motion.widget.MotionLayout ... >

        <ImageView  android:id="@+id/imageView0" .. />
        <ImageView  android:id="@+id/imageView1" .. />
        <ImageView  android:id="@+id/imageView2" .. />
        <ImageView  android:id="@+id/imageView3" .. />
        <ImageView  android:id="@+id/imageView4" .. />

        <androidx.constraintlayout.helper.widget.Carousel
            android:id="@+id/carousel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:carousel_forwardTransition="@+id/forward"
            app:carousel_backwardTransition="@+id/backward"
            app:carousel_previousState="@+id/previous"
            app:carousel_nextState="@+id/next"
            app:carousel_infinite="true"
            app:carousel_firstView="@+id/imageView2"
            app:constraint_referenced_ids="imageView0,imageView1,imageView2,imageView3,imageView4" />

    </androidx.constraintlayout.motion.widget.MotionLayout>

Kodda bir Carousel adaptörü kurun:

Kotlin

carousel.setAdapter(object : Carousel.Adapter {
            override fun count(): Int {
              // Return the number of items in the Carousel.
            }

            override fun populate(view: View, index: Int) {
                // Implement this to populate the view at the given index.
            }

            override fun onNewItem(index: Int) {
                // Called when an item is set.
            }
        })

Java

carousel.setAdapter(new Carousel.Adapter() {
            @Override
            public int count() {
                // Return the number of items in the Carousel.
            }

            @Override
            public void populate(View view, int index) {
                // Populate the view at the given index.
            }

            @Override
            public void onNewItem(int index) {
                 // Called when an item is set.
            }
        });

Ek notlar

"Seçili" olan geçerli öğeye bağlı olarak Carousel ayında, manzaranın önce veya sonrasındaki öğeleri temsil eden verilerin doğru şekilde gizlenmesi gerekebilir. Carousel start ve end'ini hesaba katın. Carousel yardımcısının işleyicileri otomatik olarak eklenir. Bu görüntülemeler varsayılan olarak şurada View.INVISIBLE olarak işaretlenir: Dolayısıyla genel düzen de değişmez.

Bunun yerine Carousel yardımcısının işaretlediği alternatif bir mod mevcut. bu görüntülemeleri View.GONE olarak belirlediniz. Bu modu, aşağıdaki özelliği kullanarak ayarlayabilirsiniz:

app:carousel_emptyViewsBehavior="gone"

Örnekler

Bant yardımcısının kullanımıyla ilgili daha fazla örnek için örnek projeler bulabilirsiniz.