Android Recyclerview 實現(xiàn)畫廊功能

你有你的各種需(借)求(鑒),我有我的各種措施,不是很強(qiáng),但是很酷! 安排~(聽說這句話最近很火)

最近啊,公司有個需求,想實現(xiàn)一個畫廊效果,我找了兩個App去給他看,問他是要類似于viewpager的有翻頁的效果,還是想要跟列表似的,手滑動到哪里就停留在哪里。 然后產(chǎn)品回復(fù)我說:就跟它的一樣(某個app),按照他的做就行,我的心里有些波瀾,甚至想****;好了不說了。寫效果吧。


gif.gif

不知道為什么是反著的,啊,湊合看吧。就是這種卡片輪播。
其他的不說了,直接上代碼。

//recyclerview滑動監(jiān)聽
hignHeadRecycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
 public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        int childCount = recyclerView.getChildCount();//總item的數(shù)量
 int width = recyclerView.getChildAt(0).getWidth();//第一個item的寬度
 int padding = (recyclerView.getWidth() - width) / 2;//這個padding是 recycler的寬度減去第一個item的寬度然后除以2,作為padding
 for (int j = 0; j < childCount; j++) {
            View v = recyclerView.getChildAt(j);//獲取每一個child
 float rate = 0;//是一個縮放比例
 if (v.getLeft() <= padding) {//如果view距離左邊的寬度 小于等于 左側(cè)剩余空間(padding) (意味著這個view開始往左邊滑動了,并且有遮擋)
 if (v.getLeft() >= padding - v.getWidth()) {//如果view距離左邊的距離 小于等于滑進(jìn)去的距離 (其實就是說滑動到一半的時候)
 rate = (padding - v.getLeft()) * 1f / v.getWidth();//(這個比例的計算結(jié)果一般都會大于1,這樣一來,根據(jù)下面的 1- rate * 0.1 得出,這個比例最多不會到達(dá)1,也就是 1- 0.1, 也就是 0.9, 所以這個view的寬度最大不會小于他本身的90%)
 } else {
                    rate = 1;
                }
                v.setScaleY(1 - rate * 0.1f);
            } else {
                if (v.getLeft() <= recyclerView.getWidth() - padding) {//這個過程大概是指這個view 從最后側(cè)剛剛出現(xiàn)的時候開始滑動過padding的距離
 rate = (recyclerView.getWidth() - padding - v.getLeft()) * 1f / v.getWidth();
                }
                v.setScaleY(0.9f + rate * 0.1f);
            }
        }

    }
});
 

//加載完成后的監(jiān)聽
hignHeadRecycler.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
    @Override
 public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
        if (hignHeadRecycler.getChildCount() < 3) {
            if (hignHeadRecycler.getChildAt(1) != null) {
                View v1 = hignHeadRecycler.getChildAt(1);
                v1.setScaleY(0.9f);
            }
        } else {
            if (hignHeadRecycler.getChildAt(0) != null) {
                View v0 = hignHeadRecycler.getChildAt(0);
                v0.setScaleY(0.9f);
            }
            if (hignHeadRecycler.getChildAt(2) != null) {
                View v2 = hignHeadRecycler.getChildAt(2);
                v2.setScaleY(0.9f);
            }
        }
    }
});

在監(jiān)聽里寫出了我自己的理解,想理解的就結(jié)合注釋和代碼看看,想直接拿去用當(dāng)然也方便你,哈哈。

還有要注意一點,寫Holder的時候,記得不要用match,這里我在Adapter里手動設(shè)置了一下。可以借鑒。

view.setLayoutParams(new LinearLayout.LayoutParams((int) (UiSizeHelper.getScreenWidth() * 0.9), LinearLayoutCompat.LayoutParams.WRAP_CONTENT));
//這里 (UiSizeHelper.getScreenWidth() * 0.9)指的是屏幕寬度的90%,這樣一來左右兩邊就都能展示出一點了。

ok,到這里。下課。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容