Android自定義WheelView的40行關鍵程式碼
阿新 • • 發佈:2019-01-29
// 給ListView設定一個滑動監聽器,就可以把它變成WheelView
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
/* 實現程式碼如下所示 */
});
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// 當滑動停止時
if(scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
View firstVisibleView = view.getChildAt(0 );
int height = firstVisibleView.getHeight();
/**
* top為firstVisibleView與parent兩者頂部的相對距離,單位為畫素。
* Android的座標軸原點在螢幕左上角,越往上y值越小。
* 由於firstVisibleView總是有部分不可見,
* 因此top的取值範圍為:(-height, 0]
*/
int top = firstVisibleView.getTop();
int visibleHeight = top + height;
if(visibleHeight <= (height >> 1)) {
// 若firstVisibleView可見高度小於等於一半,則上滑直至不可見
view.scrollBy(0, visibleHeight + ((ListView)view).getDividerHeight());
} else {
// 若firstVisibleView可見高度大於一半,則下滑直至完全可見
view.scrollListBy(0 , top);
}
// 呼叫scrollBy()之後,會引發onScroll()
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int newMiddlePosition = firstVisibleItem + ((visibleItemCount - 1) >> 1);
if (mMiddlePosition != newMiddlePosition) {
mMiddlePosition = newMiddlePosition;
BaseAdapter adapter = ((BaseAdapter)view.getAdapter());
adapter.notifyDataSetChanged();
// 接著可以呼叫監聽mMiddlePosition變化的自定義listener
}
}