赞
踩
公司项目需要做一个签到送积分的系统,要求app实现这种签到功能。先在网上找了一些资料,有些用自定义View画图实现,其实对于普通码农对绘图会没耐心看各自算法。所以自己动手撸一个通用型日历,使用ViewPager+Releteview+Calendar+算法实现。想着这次也为了以后做其他项目中能用到,因为真心觉得很实用。
gitHup源码地址:https://github.com/aiyangtianci/aiyang_canary
效果图:
目录
一款日历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;
- }
- }
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,这样使用时代码可以直接复制到实际项目中。
没有积分下载的朋友可以加群索要,欢迎入群!
相关资料推荐:
Java/Android 日期格式SimpleDateFormat转换,以及Date和Calendar的使用
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。