本文只是慕課網(wǎng)的課程《自定義實現(xiàn)日歷控件》里面自己不太理解的地方記錄下來胞谭,當(dāng)作自己的學(xué)習(xí)筆記垃杖,大神請自動忽略本文。
跳過開頭部分丈屹,我們直接看渲染控件的那個方法吧
/**
* 渲染日歷控件
*/
private void renderCalendar() {
//當(dāng)前月份展示
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);
tvDate.setText(simpleDateFormat.format(mCalender.getTime()));
//gridview數(shù)據(jù)展示
ArrayList<Date> cells = new ArrayList<>();
Calendar calendar = (Calendar) mCalender.clone();
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.add(Calendar.DAY_OF_MONTH, -prevDays);
int maxCellCount = 6 * 7;
while (cells.size() < maxCellCount) {
cells.add(calendar.getTime());
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
````
這里只是將上面關(guān)于日期的一些方法做個說明
calendar.set(Calendar.DAY_OF_MONTH, 1);
這段代碼的就代表將時間設(shè)置為當(dāng)月的第一天调俘,舉個例子,
假如今天是2017-12-8旺垒,當(dāng)設(shè)置了這段代碼后彩库,就會變?yōu)?017-12-1
calendar.get(Calendar.DAY_OF_WEEK)
這段代碼是關(guān)于星期的展示,用來獲取當(dāng)前日期是星期幾
注:今天是星期幾袖牙,這里是以星期天為一周的第一天
但是在視頻中是這樣寫的
int prevDays = calendar.get(Calendar.DAY_OF_WEEK) - 1;
這是什么意思呢侧巨?我是這樣理解的
calendar.get(Calendar.DAY_OF_WEEK) 的值為1~7之間的整數(shù),1代表周日鞭达,7代表周六司忱,其余依次類推皇忿,減一是判斷本月一號之前空幾位,舉個例子:假如今天是2017-12-8 星期五坦仍,那么calendar.get(Calendar.DAY_OF_WEEK) = 6鳍烁,prevDays = 6 - 1 = 5,即一號之前有五個位置是空的。
接著往下看繁扎,calendar.add(Calendar.DAY_OF_MONTH, -prevDays);
接著奉上我的理解
calendar.add(Calendar.DAY_OF_MONTH, -2)代表的是什么呢幔荒?假如今天是2017-12-1,那么這段代碼輸出的日期就是2017-11-29梳玫,就是將當(dāng)前日期回滾了兩天爹梁,這樣就不難理解了吧!
calendar.add(Calendar.DAY_OF_MONTH, -prevDays)代表上個月的最后 prevDays 天提澎,因為在開始繪制的時候?qū)?dāng)前設(shè)置為本月的第一天了
接著往下看姚垃,int maxCellCount = 6 * 7;
一周最多是七天,一個月最多占六行盼忌,舉個例子积糯,假如這個月的一號是在周六并且這個月是三十一天,那么一號就獨占一行谦纱,那么剩下的三十天就在其他行了就會有 4 * 7 = 28,占據(jù)滿滿的四行川慌,剩余31-1-28=2天獨占一行偿荷。這樣一個月就展示完了跳纳,最多占據(jù)六行寺庄。
如圖所示
date.png
接著往下看斗塘,就到循環(huán)里面去添加數(shù)據(jù)了
while (cells.size() < maxCellCount) {
cells.add(calendar.getTime());
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
解釋:
cells.add(calendar.getTime()); 是將當(dāng)前的時間添加到cells這個list當(dāng)中
calendar.add(Calendar.DAY_OF_MONTH, 1);經(jīng)過上面的分析馍盟,不難看出茧吊,這段代碼是將日期向后移動一天,舉個例子瞄桨,假如今天是2017-12-8,那么calendar.add(Calendar.DAY_OF_MONTH, 1)之后就變成了2017-12-9泊交。
剩下的還請各位朋友去看視頻廓俭,視頻上講的很詳細(xì)白指。
慕課網(wǎng)地址:https://www.imooc.com/酵紫,搜索“自定義實現(xiàn)日歷控件”即可看到講解視頻了奖地。
本文demo已上傳到GitHub上了参歹,下載源碼