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

Android 签到打卡日历,自定义日期可带图标(附源码)前 言 公司项目需要做一个签到送积分的系统 要求 app 实现这种签到功能 先在网上找了一些资料 有些用自定义 View 画图实现 其实对于普通码农对绘图会没耐心看各自算法 所以自己动手撸一个通用型日历 使用 ViewPager Releteview Calendar 算法实现

大家好,我是讯享网,很高兴认识大家。

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

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

 

效果图:


讯享网

 

目录

前言

一、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; } / * 得到某月多少天 * 哈哈少儿口诀:腊三十一天永不差,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源码免费下载。

相关资料推荐:

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

 

 

小讯
上一篇 2025-01-18 13:16
下一篇 2025-01-13 20:02

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/13580.html