满足你各种姿势的最美Android开源日历

接下来请看CalendarView骚操作,看看它是可以怎样调教的

  • 你这样继承自己的月视图和周视图,只需要依次实现绘制选中:onDrawSelected、绘制事务:onDrawScheme、绘制文本:onDrawText这三个回调即可,参数和坐标都已经在回调函数上实现好,周视图也是一样的逻辑,只是不需要y参数

/**

  • 定制高仿魅族日历界面,按你的想象力绘制出各种各样的界面
  • Created by huanghaibin on 2017/11/15.
    */

public class MeiZuMonthView extends MonthView {

/**

  • 绘制选中的日子
  • @param canvas canvas
  • @param calendar 日历日历calendar
  • @param x 日历Card x起点坐标
  • @param y 日历Card y起点坐标
  • @param hasScheme hasScheme 非标记的日期
  • @return 返回true 则绘制onDrawScheme,因为这里背景色不是是互斥的,所以返回true
    */
    @Override
    protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) {
    canvas.drawRect(x + mPadding, y + mPadding, x + mItemWidth - mPadding, y + mItemHeight - mPadding, mSelectedPaint);
    return true;
    }

/**

  • 绘制标记的事件日子
  • @param canvas canvas
  • @param calendar 日历calendar
  • @param x 日历Card x起点坐标
  • @param y 日历Card y起点坐标
    */
    @Override
    protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) {
    canvas.drawCircle(x + mItemWidth - mPadding - mRadio / 2, y + mPadding + mRadio, mRadio, mSchemeBasicPaint);
    canvas.drawText(calendar.getScheme(),
    x + mItemWidth - mPadding - mRadio / 2 - getTextWidth(calendar.getScheme()) / 2,
    y + mPadding + mSchemeBaseLine, mTextPaint);
    }

/**

  • 绘制文本
  • @param canvas canvas
  • @param calendar 日历calendar
  • @param x 日历Card x起点坐标
  • @param y 日历Card y起点坐标
  • @param hasScheme 是否是标记的日期
  • @param isSelected 是否选中
    */
    @Override
    protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) {
    int cx = x + mItemWidth / 2;
    int top = y - mItemHeight / 6;

boolean isInRange = isInRange(calendar);

if (isSelected) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
mSelectTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, mSelectedLunarTextPaint);
} else if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentMonth() && isInRange ? mSchemeTextPaint : mOtherMonthTextPaint);

canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, mCurMonthLunarTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() && isInRange ? mCurMonthTextPaint : mOtherMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10,
calendar.isCurrentDay() && isInRange ? mCurDayLunarTextPaint :
calendar.isCurrentMonth() ? mCurMonthLunarTextPaint : mOtherMonthLunarTextPaint);
}
}
}

  • 当你实现好之后,直接在xml界面上添加特性,可以即时预览效果:


app:month_view=“com.haibin.calendarviewproject.MeiZuCalendarCardView”
app:week_view=“com.haibin.calendarviewproject.MeiZuWeekView”

  • 但这种静态模式可能无法满足你的需求,你可能需要动态变换定制的视图界面,于是你可以使用热插拔特性,即插即用,不爽就换:

mCalendarView.setWeekView(MeizuWeekView.class);

mCalendarView.setMonthView(MeizuMonthView.class);

  • CalendarView也提供了高效便利的年视图,可以快速切换年份、月份,十分便利

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 但年视图也不一定就适合产品经理的胃口,产品经理希望像小米日历一样,弹出DatePickerView,通过它来跳转日期,于是你可以使用以下的API来让日历与其它控件联动

CalendarView.scrollToCalendar();

CalendarView.scrollToNext();

CalendarView.scrollToPre();

CalendarView.scrollToXXX();

  • 你也许需要像魅族日历一样,可以静态、动态更换周起始

app:week_start_with=“mon、sun、sat”

CalendarView.setWeekStarWithSun();

CalendarView.setWeekStarWithMon();

CalendarView.setWeekStarWithSat();

  • 假如你是做酒店、旅游等应用场景的APP的,那么需要可选范围的日历,你可以这样继承,和普通视图实现完全一样

public class CustomRangeMonthView extends RangeMonthView{

}

public class CustomRangeWeekView extends RangeWeekView{

}

  • 然后你需要设置选择模式为范围模式:select_mode=“range_mode”

  • 酒店式日历场景当然是不能从昨天开始订房的,也不能无限期订房,所以你需要静态或动态设置日历范围、精确到具体某一天!!!

最后

我一直以来都有整理练习大厂面试题的习惯,有随时跳出舒服圈的准备,也许求职者已经很满意现在的工作,薪酬,觉得习惯而且安逸。

不过如果公司突然倒闭,或者部门被裁减,还能找到这样或者更好的工作吗?

我建议各位,多刷刷面试题,知道最新的技术,每三个月可以去面试一两家公司,因为你已经有不错的工作了,所以可以带着轻松的心态去面试,同时也可以增加面试的经验。

我可以将最近整理的一线互联网公司面试真题+解析分享给大家,大概花了三个月的时间整理2246页,帮助大家学习进步。

由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!以下是部分内容截图:

部分目录截图

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值