【原创,转载请注明出处】
【使用效果】
未点击.jpg
点击.jpg
注释很详细,因此直接上代码:
CalendarScheduleView.java
/**
* 日历型排班表
* 注意:只能显示本月的日期
* 功能1:对两种日期进行圆圈背景显示:可排班日期-mSelectableDayColor、已预约日期-mSelectedDayColor
* 注意:这些日期必须在今日及今日之后,以及,“已预约日期应该包含于可预约日期等逻辑”应该由外部判断
* 功能2;对点击的日期进行回调,返回点击日期值给外部调用者,日期格式为 年-月-日 分别返回
*/
public class CalendarScheduleView extends View {
// 画笔
private Paint paint;
// 列数
private static final int NUMS_COLUMN = 7;
// 行数(星期一行加日期六行)
private static final int NUMS_ROW = 7;
// 周日到周六的颜色
private int mWeekColor = Color.parseColor("#8B8B8B");
// 本月日期的颜色
private int mMonthDateColor = Color.parseColor("#000000");
// 非本月日期的颜色
private int mOtherDateColor = Color.parseColor("#AEAEAE");
// 可选日期的背景颜色
private int mSelectableDayColor = Color.parseColor("#9EB7B5");
// 选中日期的背景颜色
private int mSelectedDayColor = Color.parseColor("#E40F57");
// 星期字体大小
private int mWeekSize = 18;
// 日期字体大小
private int mDateSize = 15;
// 可选、选择日期的圆圈半径
private float mCircleR;
// 当前年
private int mCurrentYear;
// 当前月
private int mCurrentMonth;
// 可选的日期(排班日期)
private List mSelectableDates = new ArrayList();
// 已选日期(已预约日期)
private List mSelectedDates = new ArrayList();
// 本月日期-在绘图时将数据储存在此,点击日历时做出判断
// 7行7列(第一行没有数据,为了计算位置方便,将星期那一行考虑进去)
private int[][] days = new int[NUMS_ROW][NUMS_COLUMN];
// 列宽
private int mColumnWidth;
// 行高
private int mRowHeight;
// DisplayMetrics对象
private DisplayMetrics displayMetrics;
// 点击事件接口
private OnDateClick onDateClick;
/**
* 构造函数
*
* @param context
* @param attrs
* @description 初始化
*/
public CalendarScheduleView(Context context, AttributeSet attrs) {
super(context, attrs);
// 获取DisplayMetrics实例
displayMetrics = getResources().getDisplayMetrics();
// 获取日历实例
Calendar calendar = Calendar.getInstance();
// new一个Paint实例(抗锯齿)
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
// 获取当前年份
mCurrentYear = calendar.get(Calendar.YEAR);
// 获取当前月份
mCurrentMonth = calendar.get(Calendar.MONTH);
// 假数据,测试用,TODO:记得删除
mSelectableDates.add(7);
mSelectableDates.add(8);
mSelectedDates.add(8);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
if (widthMode == MeasureSpec.AT_MOST) {
widthSize = displayMetrics.densityDpi * 100;
}
int heightSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(widthMeasureSpec);
if (heightMode == MeasureSpec.AT_MOST) {
heightSize = displayMetrics.densityDpi * 120;