一款安卓日曆(二)

2021-08-03 03:04:02 字數 2528 閱讀 8377

月檢視和周檢視滑動切換,是自定義的mwcalendar繼承linearlayout,實現了nestedscrollingparent介面,消費了recyclerview的滑動距離,實現整體上滑,在滑動過程中根據條件判斷是否顯示周檢視weekcalendar,用overscroller實現滾動。

關於nestedscrollingparentrecyclerview的巢狀滑動,網上已經有比較詳細的資料,這裡不再複製貼上,只講一下實現細節,我主要參考了hongyang的**文章android nestedscrolling機制完全解析 帶你玩轉巢狀滑動。

mwcalendar是乙個繼承linearlayout,並實現nestedscrollingparent的容器,裡面包含了乙個月檢視monthcalendar和乙個recyclerviewweekcalendar是在xml載入完後以引數的方式傳進去的,目的是為了使mwcalendarweekcalendar同在乙個relativelayout中方便處理切換,recyclerview向上滑動時,讓nestedscrollingparent消耗掉recyclerview的上滑距離,當向上滑動到只剩乙個行高的時候,nestedscrollingparent停止滑動,由recyclerview繼續滑動。這裡主要說onstartnestedscroll(),onstopnestedscroll(),onnestedprescroll()onmeasure()這四個方法。

@override

public

void

onnestedprescroll(view target, int dx, int dy, int consumed)

}

這個方法在滑動時呼叫,用來判斷月檢視和周檢視的切換,dy>0向上滑,且滑動距離getscrolly()@override

public

void

onstopnestedscroll(view target)

if (state == open) else

}if (state == close) else }}

-----------

private

void

startscroll(int starty,int dy,int duration)這個方法是停止滑動手鬆開的時候呼叫,在這個方法中根據狀態判斷是上滾還是下滾,再根據已滑動的距離getscrolly()和總的滑動距離得到需要利用mscroller滾動的距離。

@override

public

void

computescroll() else

if (scrolly == 5 * rowheigh) else

if (mscroller.computescrolloffset())

}

computescroll()方法,在執行mscroller.startscroll()後呼叫,實時呼叫並繪製介面,所以可以在這個方法中判斷周檢視和月檢視哪個應該顯示。

@override

protected

void

onmeasure(int widthmeasurespec, int heightmeasurespec)

nestedscrollingparent中如果不重寫onmeasure()方法,會出現上滑的過程中,下面的部分是空白的,原因是整體view測量的時候,測量的結果適應螢幕的大小,在上滑的過程中並沒有重新測量,上滑的時候整體view一起整體上滑,view的高度還是那麼高,向上滑出一部分,下面的就變成空白了。所以我們需要做的就是在view測量的時候,給recyclerview加高,這樣上滑的時候也是正常顯示,這個加高不是隨便加的,必須是停止滑動的時候正好能顯示recyclerview的全部資料,這樣就可以計算得到,加高的部分是正常的高度減去上面一行的高度,強行把recyclerview加高已補充上滑出去的那部分檢視。

這就是處理滑動切換檢視的主要方法和邏輯,完成專案參見:

推薦一款優雅的日曆控制項

專案需要用到日曆控制項,這是我們的效果圖。gradle 關聯 implementation com.haibin calendarview 3.4.0 使用 剛開始布局中使用的話注意是有包名路徑的,如果直接是使用的是系統自帶的日曆控制項。haibin calendarview calendarvie...

推薦一款優雅的日曆控制項

專案需要用到日曆控制項,這是我們的效果圖。gradle 關聯 implementation com.haibin calendarview 3.4.0 使用剛開始布局中使用的話注意是有包名路徑的,如果直接是使用的是系統自帶的日曆控制項。match parent android layout heig...

推薦一款優雅的日曆控制項

專案需要用到日曆控制項,這是我們的效果圖。gradle 關聯 implementation com.haibin calendarview 3.4.0 使用剛開始布局中使用的話注意是有包名路徑的,如果直接是使用的是系統自帶的日曆控制項。自定義 monthview 取消日曆字型加粗 mcurmonth...