当前位置:   article > 正文

Android 签到打卡日历,自定义日期可带图标(附源码)_android 签到日历

android 签到日历

公司项目需要做一个签到送积分的系统,要求app实现这种签到功能。先在网上找了一些资料,有些用自定义View画图实现,其实对于普通码农对绘图会没耐心看各自算法。所以自己动手撸一个通用型日历,使用ViewPager+Releteview+Calendar+算法实现。想着这次也为了以后做其他项目中能用到,因为真心觉得很实用。

gitHup源码地址:https://github.com/aiyangtianci/aiyang_canary

 

效果图:

 

目录

前言

一、Calendar类(关键)

二、BaseAdapter中做数据

三、总结


一、Calendar类(关键

一款日历App,肯定少不了要用到 Calendar类。

  1. public class SpecialCalendar {
  2. /**
  3. * 判断是否是闰年
  4. */
  5. public boolean isLeapYear(int year){
  6. if (year % 100 == 0 && year % 400 == 0){
  7. return true;
  8. }else if (year % 100 != 0 && year % 4==0){
  9. return true;
  10. }
  11. return false;
  12. }
  13. /**
  14. * 得到某月多少天
  15. * 哈哈少儿口诀:1357810腊三十一天永不差,469冬三十日平年二月28,闰年再把一天加。
  16. */
  17. public int getDaysOfMonth(boolean isLeapYear,int month){
  18. int days=0;
  19. switch (month){
  20. case 1:
  21. case 3:
  22. case 5:
  23. case 7:
  24. case 8:
  25. case 10:
  26. case 12:
  27. days=31;
  28. break;
  29. case 4:
  30. case 6:
  31. case 9:
  32. case 11:
  33. days=30;
  34. break;
  35. case 2:
  36. if (isLeapYear){
  37. days=29;
  38. }else{
  39. days=28;
  40. }
  41. }
  42. return days;
  43. }
  44. /**
  45. * 得到某年某月一号是星期几 (0-6 日-六)
  46. */
  47. public int getWeekdayOfMonth( int mYear, int mMonth){
  48. Calendar cal=Calendar.getInstance();
  49. cal.set(mYear,mMonth,1);
  50. return cal.get(Calendar.DAY_OF_WEEK)-1;
  51. }
  52. }

二、BaseAdapter中做数据

1、先在activity中初始化一下下小数据:

  1. Calendar calendar=Calendar.getInstance();
  2. mYear = calendar.get(Calendar.YEAR); // 获取当前年份
  3. mMonth = calendar.get(Calendar.MONTH) ;// 获取当前月份以(0开头)
  4. mDay = calendar.get(Calendar.DAY_OF_MONTH) ;// 获取当前天以(0开头)
  5. SpecialCalendar mCalendar=new SpecialCalendar();//创建自己写的日历类 获取某月总天数 和 一号是星期几
  6. boolean isLeapYear =mCalendar.isLeapYear(mYear);
  7. int mDays=mCalendar.getDaysOfMonth(isLeapYear,mMonth+1);
  8. int week =mCalendar.getWeekdayOfMonth(mYear,mMonth);
  9. adapter=new RegistrationAdapter(this,mDays,week,mDay);//适配器带参构造实现
  10. Calendar calendar=Calendar.getInstance();
  11. mYear = calendar.get(Calendar.YEAR); // 获取当前年份
  12. mMonth = calendar.get(Calendar.MONTH) ;// 获取当前月份以(0开头)
  13. mDay = calendar.get(Calendar.DAY_OF_MONTH) ;// 获取当前天以(0开头)
  14. SpecialCalendar mCalendar=new SpecialCalendar();//创建自己写的日历类 获取某月总天数 和 一号是星期几
  15. boolean isLeapYear =mCalendar.isLeapYear(mYear);
  16. int mDays=mCalendar.getDaysOfMonth(isLeapYear,mMonth+1);
  17. int week =mCalendar.getWeekdayOfMonth(mYear,mMonth);
  18. adapter=new RegistrationAdapter(this,mDays,week,mDay);//适配器带参构造实现

2、适配器关键的小小算法:

  1. private final int days;
  2. private final int week;
  3. private int[] dayNumber;
  4. private final int day;
  5. /**
  6. * 得到42格子 每一格子的值
  7. */
  8. private void getEveryDay(){
  9. dayNumber=new int[42];//总共42个方块格子
  10. for (int i=0;i<42;i++){
  11. if (i < days+week && i >= week){//这么解释:第一行共7格子和星期的7天 做计算 i>=week 意思是从第一个方块格开始往dayNumber里放几号
  12. dayNumber[i]=i-week+1;
  13. }else{
  14. dayNumber[i]=0;//不是这个月内每一号1..10..31所赋值的,则全部赋值为0 ;方便点击时判断值是不是为0,是的话说明点的空白格子了
  15. }
  16. }
  17. }

 

三、总结

代码很简单,思路也很容易理解。如果不懂也没关系,可以直接进群或留言,我会耐心解答。

可以根据你们公司的“产品”设计图的具体业务逻辑去扩展实现,~~ 总之,核心代码就是以上部分 。

如果看官们懒得手打代码,当然也可以下载的我的签到demo,这样使用时代码可以直接复制到实际项目中。 

没有积分下载的朋友可以加群索要,欢迎入群!

demo源码免费下载

相关资料推荐:

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

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/930179
推荐阅读
相关标签
  

闽ICP备14008679号