Android 簽到打卡日曆,自定義日期可帶圖示(附原始碼)

艾陽丶發表於2017-04-26

公司專案需要做一個簽到送積分的系統,要求app實現這種簽到功能。先在網上找了一些資料,有些用自定義View畫圖實現,其實對於普通碼農對繪圖會沒耐心看各自演算法。所以自己動手擼一個通用型日曆,使用ViewPager+Releteview+Calendar+演算法實現。想著這次也為了以後做其他專案中能用到,因為真心覺得很實用。

原始碼地址http://download.csdn.net/detail/csdn_aiyang/9826739

相關資料:

Java/Android 日期格式SimpleDateFormat轉換,以及Date和Calendar的使用

效果圖:

 

目錄

前言

一、Calendar類(關鍵)

二、BaseAdapter中做資料

三、總結


一、Calendar類(關鍵

一款日曆App,肯定少不了要用到 Calendar類。

public class SpecialCalendar {

    /**
     * 判斷是否是閏年
     */
    public boolean isLeapYear(int year){
        if (year % 100 == 0 && year % 400 == 0){
            return true;
        }else if (year % 100 != 0 && year % 4==0){
            return true;
        }
        return false;
    }

    /**
     * 得到某月多少天
     * 哈哈少兒口訣:1357810臘三十一天永不差,469冬三十日平年二月28,閏年再把一天加。
     */
    public int getDaysOfMonth(boolean isLeapYear,int month){
        int days=0;
        switch (month){
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                     days=31;
                     break;
            case 4:
            case 6:
            case 9:
            case 11:
                    days=30;
                    break;
            case 2:
                if (isLeapYear){
                     days=29;
                }else{
                     days=28;
                }
        }
        return days;
    }

    /**
     * 得到某年某月一號是星期幾  (0-6 日-六)
     */
    public int getWeekdayOfMonth( int mYear, int mMonth){
        Calendar cal=Calendar.getInstance();
        cal.set(mYear,mMonth,1);
        return cal.get(Calendar.DAY_OF_WEEK)-1;
    }
}

二、BaseAdapter中做資料

1、先在activity中初始化一下下小資料:

Calendar calendar=Calendar.getInstance();
        mYear = calendar.get(Calendar.YEAR); // 獲取當前年份
        mMonth = calendar.get(Calendar.MONTH) ;// 獲取當前月份以(0開頭)
        mDay = calendar.get(Calendar.DAY_OF_MONTH) ;// 獲取當前天以(0開頭)

        SpecialCalendar mCalendar=new SpecialCalendar();//建立自己寫的日曆類 獲取某月總天數 和 一號是星期幾
        boolean isLeapYear =mCalendar.isLeapYear(mYear);
        int mDays=mCalendar.getDaysOfMonth(isLeapYear,mMonth+1);
        int week =mCalendar.getWeekdayOfMonth(mYear,mMonth);

        adapter=new RegistrationAdapter(this,mDays,week,mDay);//介面卡帶參構造實現
	Calendar calendar=Calendar.getInstance();
        mYear = calendar.get(Calendar.YEAR); // 獲取當前年份
        mMonth = calendar.get(Calendar.MONTH) ;// 獲取當前月份以(0開頭)
        mDay = calendar.get(Calendar.DAY_OF_MONTH) ;// 獲取當前天以(0開頭)

        SpecialCalendar mCalendar=new SpecialCalendar();//建立自己寫的日曆類 獲取某月總天數 和 一號是星期幾
        boolean isLeapYear =mCalendar.isLeapYear(mYear);
        int mDays=mCalendar.getDaysOfMonth(isLeapYear,mMonth+1);
        int week =mCalendar.getWeekdayOfMonth(mYear,mMonth);

        adapter=new RegistrationAdapter(this,mDays,week,mDay);//介面卡帶參構造實現

2、介面卡關鍵的小小演算法:

    private final int days;
    private final int week;
    private int[] dayNumber;
    private final int day;

    /**
     * 得到42格子 每一格子的值
     */
    private void getEveryDay(){
        dayNumber=new int[42];//總共42個方塊格子 

        for (int i=0;i<42;i++){
            if (i < days+week && i >= week){//這麼解釋:第一行共7格子和星期的7天 做計算 i>=week 意思是從第一個方塊格開始往dayNumber裡放幾號
                dayNumber[i]=i-week+1;
            }else{
                dayNumber[i]=0;//不是這個月內每一號1..10..31所賦值的,則全部賦值為0  ;方便點選時判斷值是不是為0,是的話說明點的空白格子了  
            }
        }
    }

 

三、總結

程式碼很簡單,思路也很容易理解。如果不懂也沒關係,可以直接進群或留言,我會耐心解答。

 

可以根據你們公司的“產品”設計圖的具體業務邏輯去擴充套件實現,~~ 總之,核心程式碼就是以上部分 。

如果看官們懶得手打程式碼,當然也可以下載的我的簽到demo,這樣使用時程式碼可以直接複製到實際專案中。 

沒有積分下載的朋友可以加群索要,歡迎入群!

demo原始碼免費下載

 

 

相關文章