Scroller滑動剖析

2021-08-27 03:24:49 字數 2052 閱讀 7112

官方介紹:scroller裡面封裝了滾動操作,並通過收集資料產生滾動動畫

1.scroller的使用
mscroller = new scroller(context);

public

void

beginscroll()

public

void

computescroll()

}

2.scroller彈性滑動原理分析

首先來看下startscroll()方法

public

void

startscroll(int startx, int starty, int dx, int dy, int duration)

可以看出scroller收集了一系列的資料,包括開始座標,偏移量,滾動時長,以當前時間作為starttime,並計算出最終座標。

然後我們來看下computescroll()方法

public

void

computescroll()

}

computescroll()方法中,我們先判斷了scroller是否滾動完畢,然後獲取currxcurry並作為引數傳入到scrollto()方法進行滾動操作,並呼叫postinvalidate()

我們繼續看下computescrolloffset是如何判斷滾動是否結束?

public

boolean

computescrolloffset()

int timepassed = (int)(animationutils.currentanimationtimemillis() - mstarttime);

if (timepassed < mduration)

else

return

true;

}

而在computescrolloffset()方法中,我們通過當前時間和startscroll()方法中獲取的starttime的時間差來計算得到currxcurry,和屬性動畫裡面的插值器原理類似。

computescroll()呼叫了scrollto進行瞬間滑動,而彈性滑動我們其實可以理解為連續的瞬間滑動,按照這種理解,computescroll()應該每隔一段時間就呼叫,才會產生彈性滑動的效果,通過檢視comutescroll()方法的呼叫鏈,我們可以看出在draw方法裡呼叫了computescroll(),所以整個流程就很清楚了。

呼叫startscroll()方法,然後invalidate(),導致view重繪,同時darw()方法裡面會呼叫computescroll()方法,在computescroll()方法中,我們首先判斷是否滑動完畢,如果沒有滑動完畢就計算currx,curry,並作為引數傳入scrollto方法中,然後呼叫postinvalidta()方法,而postinvalidate()也會導致view重繪,結果就進入到迴圈狀態,直到滾動結束。

3.scroller實現彈性滑動的流程

Scroller使用分析

我們在需求實現時,經常遇到view滑動的情況,而scrollto scrollby方法都可以實現view的滑動,但是效果是瞬間完成的,使用者體驗並不好,我們可以使用scroller或者smoothscrollto 內部也是scroller實現的 來實現平滑移動的效果。常見於自定義view中。mscr...

scroller 做自己的動畫效果

在介紹scroller類之前,我們先去了解view的scrollby 和scrollto 方法的區別,在區分這兩個方法的之前,我們要先理解view 裡面的兩個成員變數mscrollx,mscrolly,x軸方向的偏移量和y軸方向的偏移量,這個是乙個相對距離,相對的不是螢幕的原點,而是view的左邊緣...

站在原始碼的角度全解Scroller工作機制(一)

在android開發中有多種方式實現view的滑動,常見的有三種如下 1 不斷地修改view的layoutparams 2 採用動畫向view施加位移效果 3 呼叫view的scrollto scrollby 前兩種方式我們還是挺熟悉的,不但見得挺多的而且還經常使用 至於最後一種方式,可能就要相對陌...