你有你的各種需(借)求(鑒),我有我的各種措施,不是很強(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,到這里。下課。