Scoller 實現 滾動位置自動復位

2021-08-01 08:39:13 字數 1679 閱讀 7451

今天公司有個需求,需要左右滾動停止後,item進行復位。

1、scrollto 是瞬間跳過去的,但是如果每次 to的距離很近,且動作很快,看起來就像是很連貫的動畫,這個類似於快速翻閱***那個

2、scoller 這個類並不直接參與滾動,它只是乙個輔助計算的工具。

舉例:一、輕觸滾動,也就是慢慢滾動

當手指抬起時,也就是 up事件結束的時候,這時候假如 控制項 滾動到了 100,但是你的需求是需要當手指抬起時,讓控制項慢慢滾動到 150。如果直接用 scrollto就會直接跳過去,沒有動畫效果。

1、在 up 事件內,呼叫         scroller.startscroll(curx, 0, movewidth, 0);  第乙個引數 是你開始 滾動的位置x,第二個是 開始滾動的 y,第三個是你要 滾動的距離x,第四個是你要滾動的距離y    如上面 則寫成          

scroller.startscroll(curx, 0, movewidth, 0);

invalidate();

也就是沿著x軸滾動 50

2、這時候view會去呼叫 computescroll() 這個方法,這個方法是需要重寫的。在這個方法裡面,我們可以進行 scrollto的操作

@override

public void computescroll()

}

二、如果你需要快速滑動,也就是飛起的那個感覺

先建立可以對事件進行速率計算的物件,下面**放在 down事件 之前

if (velocitytracker == null) 

velocitytracker.addmovement(ev);

然後在 up 時進行速率的計算

velocitytracker.computecurrentvelocity(1000);

float velocityx = velocitytracker.getxvelocity();

float velocityy = velocitytracker.getyvelocity();

velocitytracker.recycle();

velocitytracker = null;

我看有不少** 執行 velocitytracker = null ,不知道為什麼,我也沒用測

math.abs(velocityx) > 50

我這裡用的是50速率,大家可以按照自己的需求,如果是 > 50 ,就 執行

scroller.fling(int startx, int starty, int velocityx, int velocityy,int minx, int maxx, int miny, int maxy));

invalidate();

return true;

這時候會去呼叫 computescroll() 這個方法,我們可以對 fling 做個標記位,如果是 fling 觸發的 computescroll,那麼當 scroller.computescrolloffset() 等於 false時,也就是控制項停下來時,再進行一次復位。

具體方法解釋可以看這個**

Scoller實現view的滑動

scoller實際上只是記錄了view要滑動到的位置 之後還是呼叫view的scollto或scollby方法進行實際上的view滾動mscroller new scroller context public void startmoveanim int starty,int dy,int dura...

使用Scoller實現彈性滑動

scroller scroller new scroller mcontext 緩慢滾動到指定位置 private voidsmoothscrollto int destx,int desty int scrollx getscrollx int deltax destx scrollx 1000m...

vue 列表自動滾動到制定位置

背景 業務開發中遇到乙個需求,是要求跳轉到新頁面,並預設選中內容,如果內容在列表的位置靠後,就需要滾動到可見範圍內。實現 1.迴圈實現列表,為每個item新增id,id item index 方便後續查詢對應項 item 2.待列表載入完後,執行滾動事件 count 預設選中內容的序號 docume...