天天看點

MyCalendar 開發日志 2

上周花了不少時間,總算把月曆的demo程式(http://blog.csdn.net/h7870181/article/details/8960478)弄清楚了。

關于畫邊框和數字以及背景的幾個函數就不想寫列出來,都是很簡單的幾個函數。重點寫一下處理日期計算的函數。calulatedate()。

這個函數的目的是計算目前頁面中42個日期的具體排列。42個日期很容易得出,看下自己電腦以及手機上的月曆,都是6行7列的一個排列。因為有時候一個月的第一天會出現在周日,而31天的話,5行是不夠使的,是以是6行7列。這就需要幾件事情需要處理:

1. 判斷當月的第一天在月曆中的位置;

2. 填充上個月的最後幾天;

3. 填充下個月的前幾天。

這個思路清楚了以後,再看程式就不難了解了。

正如我自己寫的注釋一樣,逐行解釋下代碼的意思吧:

settime(curdate),将月曆設定成目前月份,這樣才能在下一行set(calendar.day_of_month, 1)函數中将index設定到當月的第一天,

然後再利用get(calendar.day_of_week)函數就可以傳回這個月的第一天是當月中的星期幾了。注意周日傳回1,周六是7。

接下來因為很多月曆有自己的模式,比如有的把周日當做一周的第一天,有的把周一當做第一天。是以monthstart -=1(or 2)來把目前的模式設定成自己想要的格式。

舉個例子更容易了解。4月1号是周二,monthstart得到的結果是3,因為我是把周日設為每周的第一天,是以,減1後monthstart是2,是以date[2] =1。 也就是當月矩陣的第3天是1号。(數組從0開始)。

MyCalendar 開發日志 2

好了,第一天找到了,接下來就開始把上個月的最後幾天填進去了。那如何确定上個月有幾天呢?

一樣的方法。

set(calendar.day_of_month, 0),經過debug檢視dayinmonth的值,我感覺把set函數的第二個參數設定成0的意思是将index復原到上個月的最後一天,然後再調用get函數當然得到的結果就是上個月的天數了。

接下來的for循環就不用多說了吧。

然後填充當月的數字:

這裡為了得到本月總共有多少天,需要先add(calendar.month,1),将index設定到下個月,然後再set(calendar.day_of_month,0)復原到上個月(也就是當月)的最後一天,然後再get一下,就得到了這個月的天數(30?31?29?28?),然後知道了這個月有多少天,有知道了第一天的位置,很容易填充了,for循環就搞定了。

然後同樣的方法,來把下個月的若幹天也填充到數組中去。

核心的算法就是這個函數。

今天再次嘗試了下全屏的方法,之前在網上看有兩種方法:

方法1:

使用xml的方法,在該項目的androidmanifest.xml檔案中,在需要全屏的activity元素中添加屬性

android:theme="@android:style/theme.notitlebar.fullscreen"

這樣就可以實作這個activity的全屏顯示,如果隻是不要标題欄,即需要保留系統自帶的工作列的話,則使用

android:theme="@android:style/theme.notitlebar"

這樣的好處是可以不用在代碼中進行修改

方法2:

即使用代碼進行修改

在activity 的oncreat函數中加入下面的代碼:

[java] view

plaincopy

MyCalendar 開發日志 2
MyCalendar 開發日志 2

requestwindowfeature(window.feature_no_title);  

getwindow().setflags(windowmanager.layoutparams. flag_fullscreen ,windowmanager.layoutparams. flag_fullscreen);  

使用代碼可以動态使該activity進行全屏,如可實作螢幕輕按兩下後進行全屏等

實際開發過程中,我使用修改xml的方法一直不行,每次在虛拟機上都運作不起來,然後嘗試了一下在代碼中修改,成功了,但是代碼一定要在 setcontentview(r.layout.activity_main_page)之前,否則還是會報錯。

另外用代碼的方法還有個不好的地方是剛開始的時候,上端的标題欄會閃一塊黑色,然後過1秒才會變成全屏的。是以一直想嘗試在xml中修改,但是可惜都成功不了。先放着吧,回頭再看看有沒有别的解決辦法。