Galeri efektine ulaşmak için RecycleView özel LayoutManager

Eski kurallar, ilk resim:

Bu efekt aslında önceki makaledeki HorizontalLayoutmanager temel alınarak değiştirilmiştir.

1. Öğenin başlangıç konumunun ekranın yarısı eksi öğe genişliğinin yarısı arasında olduğu ve her öğenin aynı genişlikte bir önceki öğenin konumunda istiflendiği görülebilir.

mStartX = getWidth () / 2-getItemShowWidth (); for (int i = 0; i < getItemCount (); i ++) { Rect rect = new Rect (mStartX + temp, 0, mStartX + temp + mItemWidth, itemHeight); mSparseArray.put (i, rect); mBooleanArray.put (i, false); temp + = getItemShowWidth (); } özel int getItemShowWidth () { return mItemWidth / 2; }

2. Tüm öğelerin örtüştüğünü görebiliriz Galerinin etkisi ortadaki öğelerin tamamen görüntülenmesi, diğer yerlerin ise yalnızca yarısının gösterilmesidir.Burada, öğe çiziminin sırasını değiştirmek için Geri Dönüştürme'de yöntemi yeniden yazmamız gerekir. Galerinin efektinin diğer ekranların yarısını ortada göstermesini istiyoruz, böylece ortadaki öğe en son çizilecek.İşte Recycleview'deki yöntem.

@Override korumalı int getChildDrawingOrder (int childCount, int i) { if (mChildDrawingOrderCallback == null) { return super.getChildDrawingOrder (childCount, i); } Başka { return mChildDrawingOrderCallback.onGetChildDrawingOrder (childCount, i); } }

childCount, ekranda görünen öğelerin sayısını temsil eder, i, aşağıda gösterildiği gibi, çizilecek öğenin konumunu temsil eder, i ne kadar küçükse, ilk çizilecek olan, aşağıda gösterildiği gibi:

İlk üç öğenin konumu indeks olarak değişmez, ortası childCount-1, sondan bir önceki çizim sırası merkezdir, sondan bir önceki çizim sırası merkez + 1'dir ve sondan bir önceki öğenin çizim sırası merkezdir. +2, yani son üç merkez + childCount- 1-i'ye karşılık gelir

public class GalleryRecycleview RecyclerView'ü genişletir { public GalleryRecycleview (Bağlam bağlamı) { bu (bağlam, boş); } public GalleryRecycleview (Bağlam bağlamı, @Nullable AttributeSet attrs) { süper (bağlam, öznitelikler); setChildrenDrawingOrderEnabled (true); } @Override korumalı int getChildDrawingOrder (int childCount, int i) { int center = getlayoutManager (). getCenterPos () -getlayoutManager (). getFistvisiblePos (); // Görüntülenen tüm Öğelerin orta konumunu hesaplayın int sipariş; if (i == center) { order = childCount-1; } else if (i > center) { sıra = merkez + childCount-1-i; } Başka { sipariş = i; } iade emri; }

Yerleşim yöneticisindeki ilk görünür öğenin ve ortadaki öğenin konumunu alın

public int getCenterPos () { int pos = (mTotalMoveX / getItemShowWidth ()); int daha = (mTotalMoveX% getItemShowWidth ()); eğer (daha fazla > getItemShowWidth () * 0.5f) pos ++; dönüş pozisyonu; } public int getFistvisiblePos () { eğer (getItemCount () == 0) { dönüş 0; } getPosition (getChildAt (0)); }

Ortadaki öğeyi en son çizenin olduğunu görebilirsiniz.

3. Ardından layoutChild olduğunda animasyon ekliyoruz

private void handleChildView (View child, int moveX) { float radyo = computeScale (moveX); kayan nokta dönüşü = computeRotationY (moveX); child.setScaleX (radyo); child.setScaleY (radyo); child.setRotationY (rotasyon); } private float computeScale (int x) { kayan ölçek = 1-Math.abs (x * 1.0f / (6f * getItemShowWidth ())); eğer (ölçek < 0) ölçek = 0; eğer (ölçek > 1) ölçek = 1; dönüş ölçeği; } / ** * Maksimum Y ekseni dönüş derecesi * / özel kayan nokta M_MAX_ROTATION_Y = 30.0f; özel float computeRotationY (int x) { şamandıra dönüşüY; rotasyonY = -M_MAX_ROTATION_Y * x / getItemShowWidth (); eğer (Math.abs (rotationY) > M_MAX_ROTATION_Y) { eğer (rotasyonY > 0) { rotasyonY = M_MAX_ROTATION_Y; } Başka { rotasyonY = -M_MAX_ROTATION_Y; } } dönüş dönüşüY; }

En iyi efektle aynı

Kaynak adresi:

https://github.com/digtal/recycleview-study

Ekli İlgili Bilgiler

Android gelişmiş

Bu Android öğrenim materyallerine ve mülakat materyallerine ihtiyaç duyanların ilgiye ihtiyacı var + özel mesaj "Android materyallerini" ücretsiz olarak yanıtlıyor!

Grupta, ileri düzey kullanıcı arayüzü, performans optimizasyonu, mimar kursları, NDK, hibrit geliştirme: ReactNative + Weex ve diğer Android teknik bilgi mimarisi video materyalleri ve kariyer planlaması dahil olmak üzere üst düzey Android hakkında birçok ücretsiz öğrenme materyali bulunmaktadır. Ve görüşme rehberliği.

"DJMAX Tribute" ilk DLC'sini duyurdu ve 20'den fazla yeni parça ekledi
önceki
Model oyun kontrolü: Infinite Latitude Dark Matter GK
Sonraki
"Mekong Operasyonu", bir Hong Kong kung fu filminde, Jackie Chan'i meşhur eden ve kötü adamların başrolünü üstlendiği altın bir yardımcı role sahiptir.
Model oyun kontrolü: tropikal canavara eskileşme! çöl!
Bu Qixi Festivali, Ta ile ne yapacaksın?
2016 Yunqi Konferansı | Aliyun Li Jin: Hesaplama insanlık için zaman satın almaktır
"Chain Deshen" "Ticaret ve Madencilik" Borsası Coineal büyük bir yenilgiye uğradı, 15 günlük kısa ömürlü refah
2017 Çin İçerik Pazarlama TöreniPazarlama ünlüleri içerik füzyonunu sizinle paylaşıyor
Android, bu makinedeki çeşitli dosya türlerinin bir listesini alır (müzik, video, resim, belge vb.)
"Gundam VS" Eylül DLC'si Nightingale, güncelleme yaması ve 1V1'e katıldı
"Mekong Operasyonu" uyuşturucu lordu Nuoka, Taylandlı aktör tarafından canlandırılıyor, gerçek yakışıklı Taylandlı Wu Yanzu.
Model Oyun Kontrolü: Shouwu Modifikasyon Kartı Niu 1.0
"Uncharted Sea: Lost Legacy" Fotoğraf Yarışması'na ilk başvuru dalgası
Android düzeltmesini manuel olarak uygulayın
To Top