View的滑動(dòng)

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方法。

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

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