1. 程式人生 > >Android自定義WheelView的40行關鍵程式碼

Android自定義WheelView的40行關鍵程式碼

// 給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 } }