月檢視和周檢視滑動切換,是自定義的mwcalendar
繼承linearlayout
,實現了nestedscrollingparent
介面,消費了recyclerview
的滑動距離,實現整體上滑,在滑動過程中根據條件判斷是否顯示周檢視weekcalendar
,用overscroller
實現滾動。
關於nestedscrollingparent
和recyclerview
的巢狀滑動,網上已經有比較詳細的資料,這裡不再複製貼上,只講一下實現細節,我主要參考了hongyang
的**文章android nestedscrolling機制完全解析 帶你玩轉巢狀滑動。
mwcalendar
是乙個繼承linearlayout
,並實現nestedscrollingparent
的容器,裡面包含了乙個月檢視monthcalendar
和乙個recyclerview
,weekcalendar
是在xml
載入完後以引數的方式傳進去的,目的是為了使mwcalendar
和weekcalendar
同在乙個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...