java如何实排班表时间算法_安卓自定义View-日历型排班表-CalendarScheduleView

本文介绍了一个自定义的Android视图`CalendarScheduleView`,用于展示日历型排班表。该视图能够显示本月日期,并用不同颜色区分可排班和已预约日期。通过接口`OnDateClick`,可以监听并处理日期点击事件,返回点击的年、月、日。代码中详细注释了各个功能的实现,包括绘制星期、日期、背景颜色等。
摘要由CSDN通过智能技术生成

【原创,转载请注明出处】

【使用效果】

e30eae795c18

未点击.jpg

e30eae795c18

点击.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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值