這次來實(shí)現(xiàn)RecyclerView
視差動(dòng)畫掐禁,先來看下效果:
那要怎么實(shí)現(xiàn)呢怜械?我這里是通過ImageView
設(shè)置Matrix
實(shí)現(xiàn),有更好的辦法歡迎留言告知傅事。
那么Matrix
是什么呢缕允?我這里就簡單的說一下,如果想詳細(xì)了解的話蹭越,請(qǐng)自行搜索查看障本。
matrix
是一個(gè)3*3
的矩陣,MSCALE_X
响鹃、MSCALE_Y
是來控制綻放的驾霜,MSKEW_X
,MSKEY_Y
是來控制錯(cuò)切的,MTRANS_X
茴迁、MTRANS_Y
是來控制位移的寄悯,MPERSP_0
、MPERSP_1
堕义、MPERSP_2
是來控制透視的,MSCALE_X
、MSCALE_Y
倦卖、MSKEW_X
洒擦、MSKEW_Y
是用來控制旋轉(zhuǎn)的。
那我們要怎么對(duì)矩陣操作怕膛,可能大家都把線性代數(shù)還回給老師了熟嫩,就算沒還,算起來也麻煩褐捻,所以谷歌給我們提供了方便的方法掸茅,分別是preRotate()
、setRotate()
柠逞、postRotate
昧狮,代表的是左乘、設(shè)置和后乘板壮。這之間的差別我就不詳細(xì)介紹了逗鸣。視差效果主要用到了位移和縮放。
那這個(gè)效果的思路是怎樣绰精?我們對(duì)效果進(jìn)行拆分撒璧,其實(shí)發(fā)現(xiàn)每個(gè)圖片的效果都是一樣的,滾動(dòng)后圖片也跟著移動(dòng)笨使,圖片從RecyclerView
頂部到達(dá)RecyclerView
底部剛好遍歷一整張圖片卿樱,頂部時(shí),圖片也顯示頂部硫椰。到達(dá)底部時(shí)殿如,圖片也顯示底部,如圖所示最爬。
那我們可以先對(duì)這個(gè)效果進(jìn)行分解涉馁,在沒有RecyclerView
的時(shí)候,對(duì)ImageView
進(jìn)行圖片的縮放和移動(dòng)爱致。
首先為ImageView
設(shè)置圖片烤送,然后設(shè)置ScapeType
為Matrix
,然后根據(jù)圖片比例進(jìn)行計(jì)算糠悯,縮放使圖片占滿ImageView
帮坚,因?yàn)槲覀兊膱D片是要上下移動(dòng),所在我們在放大的時(shí)候要在CenterCrop
的基礎(chǔ)上保證上下有一部分剩余互艾,這樣才可以移動(dòng)试和。并且圖片一開始位于ImageView
的頂部。代碼如圖所示:
這里做的事件也很簡單纫普,獲取drawable
的原始寬高和ImageView
的原始寬高阅悍,通過postScale()
進(jìn)行比較縮放,讓圖片占滿整個(gè)ImageView
,這里ImageView
的高度乘以1.1主要用于控制縮放后的圖片高度超過ImageView
高度的1.1倍节视。當(dāng)置于recyclerview
移動(dòng)時(shí)拳锚,讓任何規(guī)格的圖片都可以上下移動(dòng),產(chǎn)生較明顯的視差效果寻行。不然的話當(dāng)圖片控件寬高比相同(小于大于和控件圖片比例有關(guān))之類的情況下霍掺,會(huì)讓圖片上下無法移動(dòng)。
那我們怎樣對(duì)內(nèi)部的圖片進(jìn)行移動(dòng)拌蜘?可以通過postTranslationY()
方法對(duì)圖片進(jìn)行上下移動(dòng)杆烁。看简卧,是不是很簡單兔魂。
通過以上的步驟我們已經(jīng)可以控制圖片縮放到正確比例并上下移動(dòng),但是我們可以發(fā)現(xiàn)存在一個(gè)問題贞滨,圖片會(huì)被移出ImageView
外面入热。我們可以進(jìn)行糾正,當(dāng)圖片被移動(dòng)到ImageView
邊框外后晓铆,把圖片糾正回ImageView
內(nèi)部勺良。代碼如下:
這里主要通過mapRect()
方法獲得通過變換后的圖片邊框位置,然后判斷是否超出ImageView
的上下邊框骄噪,進(jìn)行糾正尚困,這樣就可能防止圖片移出ImageView
的邊框。
現(xiàn)在我們已經(jīng)知道怎么圖片怎么通過Matrix
進(jìn)行移動(dòng)链蕊。那實(shí)現(xiàn)RecyclerView
的視差動(dòng)畫肯定也難不倒聰明的你事甜,只需要為RecyclerView
添加addOnScrollListener()
監(jiān)聽,當(dāng)RecyclerView
滾動(dòng)時(shí)滔韵,根據(jù)每個(gè)Item
距離RecyclerView
頂部的距離移動(dòng)對(duì)應(yīng)的比例逻谦。這樣,我們就實(shí)現(xiàn)了我們的視差效果陪蜻。