先看效果圖:
在實(shí)現(xiàn)這個(gè)效果的時(shí)候,我考慮過使用自定義view或者viewgroup來實(shí)現(xiàn)十艾。但是自定義view有一個(gè)很大的缺陷抵代,關(guān)于上面的條目,都應(yīng)該是從服務(wù)器獲取的忘嫉,不能直接draw bitmap就解決了荤牍。然后就是自己來實(shí)現(xiàn)viewgroup了案腺,用viewgroup來實(shí)現(xiàn)上圖效果并不難。但是view的循環(huán)利用卻是一個(gè)痛點(diǎn)康吵,所以最后我選擇用recyclerview來實(shí)現(xiàn)這個(gè)效果劈榨。
首先你需要了解recyclerView的基本使用,參考鴻洋blog:傳送門
接下來晦嵌,我們來拆解這個(gè)效果同辣。(recyclerView以下簡稱為rv)
1.至少,先把控件View展示出來惭载。這里可以直觀的看到旱函,每一個(gè)item占rv的寬度1/7.在rv的設(shè)計(jì)初衷里,對于item的布局描滔,測量棒妨,回收等都托付給layoutmanager來實(shí)現(xiàn)。所以我們要寫一個(gè)layoutmanager來展示item含长。說實(shí)話券腔,這是塊很難啃的骨頭,我現(xiàn)在也是一知半解拘泞。參考:傳送門這個(gè)博主寫的很詳細(xì)纷纫,我這里不再贅述,直接看關(guān)鍵代碼陪腌。
上面把每個(gè)item設(shè)置為寬度的1/7.
在這個(gè)效果中辱魁,與其他layoutmanager不同的關(guān)鍵點(diǎn)就在這里,固定分配1/7的寬度偷厦,把item縮下去商叹。其他的滾動,回收基本一個(gè)套路只泼,請看上面那個(gè)傳送門剖笙。
2.擴(kuò)展自己的recyclerView。主要流程分析:觸屏事件:點(diǎn)擊一個(gè)item请唱,從這個(gè)item開始向兩邊梯度下降item弥咪。放開后,兩側(cè)item下落回到原點(diǎn)十绑。然后判斷要不要滾動聚至,把選中的item滾到中間。切換事件:提供兩個(gè)方法切換上一個(gè)下一個(gè)本橙。都是先把當(dāng)前選中的item落下扳躬,升起上一個(gè)或下一個(gè)item,然后判斷要不要滾動到中間。
反正這個(gè)效果不需要用戶通過touch事件滑動rv贷币,所以我們直接setOnTouchListener覆蓋rv原有的touch邏輯击胜。
上面是實(shí)現(xiàn)梯度的關(guān)鍵,通過判斷間距來設(shè)置translationY役纹。需要注意的是rv.getChildAt 這個(gè)方法偶摔,所傳的參數(shù)是從第一個(gè)可視item開始算的,相對于第一個(gè)可視item的位置促脉,并不是所有數(shù)據(jù)的序號辰斋。
開始下落動畫瘸味,下落完成后判斷滾動
smoothScrollBy是可以傳超過滾動范圍的值的宫仗,它內(nèi)部已經(jīng)幫你處理好了,我這里就不再判斷了硫戈。
然后是提供外部調(diào)用的切換方法
基本流程如上。我知道這樣子看會一頭霧水丁逝,所以這里給出可以運(yùn)行的demo:github?求star~
一點(diǎn)小事:坐標(biāo)廣州,有需要實(shí)習(xí)生梭姓,初級android開發(fā)么霜幼,2017屆應(yīng)屆生。請聯(lián)系我誉尖!