Android中View可以通過(guò)三種方式實(shí)現(xiàn)滑動(dòng)
- 通過(guò)View本身提供的scrollTo/scrollBy方法實(shí)現(xiàn)滑動(dòng)。
- 通過(guò)動(dòng)畫給View施加平移效果開實(shí)現(xiàn)滑動(dòng)。
- 通過(guò)改變View的LayoutParams,使得View重新布局從而實(shí)現(xiàn)滑動(dòng)。
scrollTo/ScrollBy
scrollTo實(shí)現(xiàn)了基于所傳遞參數(shù)的絕對(duì)滑動(dòng),scrollBy則是實(shí)現(xiàn)了基于當(dāng)前位置的相對(duì)滑動(dòng)。從源碼上看,scrollBy實(shí)際上就是調(diào)用了scrollTo方法。scrollTo/scrollBy 只能改變View內(nèi)容的位置,而不能改變View在布局中的位置。
操作簡(jiǎn)單,適合對(duì)View的內(nèi)容的滑動(dòng)。
動(dòng)畫
主要是操作View的translationX和translationY屬性。View動(dòng)畫是對(duì)View的影像做操作,它并不能真正改變View的位置參數(shù),包括寬/高。并且如果希望動(dòng)畫后的狀態(tài)得以保留還必須將fillAfter屬性設(shè)置為true。
主要適用于沒有交互的View和實(shí)現(xiàn)復(fù)雜的動(dòng)畫效果。
LayoutParams
這種方法實(shí)現(xiàn)View的滑動(dòng),就是改變布局的參數(shù),即改變LayoutParams。這種方法操作稍微復(fù)雜,適用于有交互的View。
實(shí)現(xiàn)彈性滑動(dòng)
Scroller
可以通過(guò)Scroller實(shí)現(xiàn)View的彈性滑動(dòng),其實(shí)就是通過(guò)一次次調(diào)用scrollTo方法來(lái)實(shí)現(xiàn)的。invalidate方法導(dǎo)致View重繪。在重繪時(shí)的draw方法中會(huì)去調(diào)用computeScroll方法(該方法在View中是一個(gè)空方法因此需要自己去實(shí)現(xiàn)),而computeScroll方法又會(huì)去向Scroller獲取當(dāng)前的scrollX和scrollY,然后通過(guò)scrollTo方法實(shí)現(xiàn)滑動(dòng),接著又去調(diào)用postInvalidate方法進(jìn)行第二次重繪,這一次重繪和第一次重繪一樣,還是會(huì)導(dǎo)致computeScroll方法被調(diào)用。
computeScrollOffset這個(gè)方法會(huì)根據(jù)時(shí)間的流逝來(lái)計(jì)算當(dāng)前scrollX和scrollY的值,概念類似插值器,該方法返回true表示滑動(dòng)還未結(jié)束,返回false則表示滑動(dòng)已經(jīng)結(jié)束。
動(dòng)畫
通過(guò)動(dòng)畫也可以實(shí)現(xiàn)View的彈性滑動(dòng)。其實(shí)現(xiàn)思想和Scroller比較類似。
延時(shí)策略
延時(shí)策略實(shí)現(xiàn)Vied彈性滑動(dòng)的核心思想:通過(guò)發(fā)送一系列延時(shí)消息從而達(dá)到一種漸進(jìn)式的效果,具體來(lái)說(shuō)可以使用Handler或View的postDelayed方法,也可以使用線程的sleep方法。