WheelView滾輪思路學習

2021-07-16 21:56:08 字數 2538 閱讀 3791

為了理解wheelview滾輪實現效果,我按照wheelview原始碼簡單的依樣畫葫蘆。

某些關鍵的計算:

1,滑動偏移量

2.顯示的範圍itemsrange,這個非常關鍵,移除item,跟新增item需要這個範圍

private itemsrange getitemsrange() 

int first = currentitem;

int count = 1;

while (count * getitemheight() < getheight())

return new itemsrange(first, count);

}

3.linearlayout布中顯示

private void drawitems(canvas canvas)

理解wheelview開源原始碼的實現思路:

1.自定義view---wheelview,通過canvas畫出乙個linearlayout的內容,能正確把linearlayout顯示出來,完成第一步。

@override

protected void ondraw(canvas canvas)

@override

public void layout(int l, int t, int r, int b)

protected void onmeasure(int widthmeasurespec, int heightmeasurespec)  else 

}setmeasureddimension(width, height);

log.d("uuu", "onmeasure" + itemslayout.getchildcount());

}

2.通過touch事件(使用原始碼的wheelscroller輔助類)讓linearlaout移動,且每超過乙個子類的高度就重設scrollingoffset,並計算移動的item數量

@override

public void onscroll(int distance)

3.通過itemsrange的範圍更新linear layout的內容,增刪linear layout子類。如果linear layout有增刪子類的話,需要重新 layout 與measure

private void updateview() 

}

private boolean rebuilditems()  else 

if (!updated)

//firstitem在可視範圍中

if (firstitem > range.getfirst() && firstitem <= range.getlast())

firstitem = i;

}} else

//不在可視範圍

int first = firstitem;

for (int i = itemslayout.getchildcount(); i < range.getcount(); i++)

}firstitem = first;

log.d("uuu", "visibleitems=" + visibleitems + " firstitem=" + firstitem + " itemslayout.getchildcount()= " + itemslayout.getchildcount());

return updated;

}

4.滑動結束後,調整item位置 

@override

public void onjustify()

}

wheel類的整個流程:

1.初始化:onmeasue --> layout --> buildviewformeasureing --> ondraw--->updateview

buildviewformeasureing --- 初始化linearlayout 內容

ondraw --- 畫linearlayout  的canvas

2.滑動的時候:onscroll-->invalidate-->ondraw--->updateview --->recycleitems(如果內容變化--->linearlayout layout).--->onjustify

onscroll--- 設定偏移量,與當前位置currentitem.

invalidate----滑動的後重新整理

ondraw----畫linearlayout 的最新位置

updateview----

recycleitems----獲取itemsrange,移除已出itemsrange的view,再增加進入itemsrange的view

原始碼:

滑鼠滾輪控制網頁橫向移動實現思路

複製 如下 body mousewheel function event,delta jquery實現網頁橫向滾動的 需要乙個mousewheel.js 簡單說就是設定window的scrollleft值,這裡一定要是window不能是body否則滾動有問題。很納悶。繫結事件mousewhell 也...

js學習筆記 095 滑鼠滾輪事件

學習本節時,除firefox 媽的,firefox終於各色了一把 外所有瀏覽器都支援 mousewheel 事件,但firefox支援dommousescroll 而dom3規範草案建議使用名 wheel 替代 mousewheel 在firefox中,可以使用非標準的dommousescroll事...

MySQL學習思路

最近拜讀了君三思老師的新作 塗抹mysql 跟著三思一步一步學mysql 感覺對整個mysql的學習思路有了更深入的認識,模擬之前學習oracle的過程與思路,學習mysql應該也有一種思路。從知識體系講,我認為oracle資料庫相關的知識和技能可以分為五個大的方面,10個小的方面 oracle的基...