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.