Android GitHub开源库CalendarView的使用

学习并记录一下,使用GitHub上面的日历控件开源库CalendarView,地址:https://github.com/huanghaibin-dev/CalendarView

实现效果如下:

添加Gradle依赖

dependencies {
......
    //日历控件
    implementation 'com.haibin:calendarview:3.6.2'
......
}

实现MultiMonthView,可多选

MultiMonthView.java继承BaseMonthView.java查看该类,里面的不同日历子view的画笔都在里面有定义,可以根据需要进行设置,要什么view就使用什么画笔进行绘制。

比如我这里的四个画笔分别对应的含义:

mCurDayLunarTextPaint 当前日期文本颜色画笔
mSchemeTextPaint  标记的文本画笔
mOtherMonthTextPaint 其它月份日期颜色
mCurDayTextPaint  当前日期文本颜色画笔
public class CustomMonthView extends MultiMonthView {
    private int mRadius;

    public CustomMonthView(Context context) {
        super(context);
    }

    @Override
    protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelectedPre, boolean isSelectedNext) {
       //绘制选中的背景
        int cx = x + mItemWidth / 2;
        int cy = y + mItemHeight / 3 + 10;

        mSelectedPaint.setAntiAlias(true);
        canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
        return true;
    }

    @Override
    protected void onPreviewHook() {
        mRadius = Math.min(mItemWidth, mItemHeight) / 5 * 2;
    }

    @Override
    protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y, boolean isSelected) {

    }

    /**
     * 绘制文本
     *
     * @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 / 8;

        if (hasScheme) {
            canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
                    isSelected ? mSelectTextPaint
                            : calendar.isCurrentDay() ? mCurDayLunarTextPaint
                            : calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint);

        } else {
            canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
                    isSelected ? mSelectTextPaint
                            : calendar.isCurrentDay() ? mCurDayLunarTextPaint
                            : calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint);
        }
        if (!isSelected && calendar.isCurrentDay())
            canvas.drawText("今", cx, mTextBaseLine + top, mCurDayTextPaint);

    }
}

布局代码使用示例

 <com.haibin.calendarview.CalendarView
                android:id="@+id/calendarView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingLeft="10dp"
                android:paddingRight="10dp"
                app:calendar_height="40dp"
                app:current_day_text_color="#2079FF"
                app:layout_constraintStart_toStartOf="@+id/tv_years"
                app:layout_constraintTop_toBottomOf="@+id/tv_years"
                app:lunar_text_size="0dp"
                app:month_view="com.gwm.careco.mobile.car.views.CustomMonthView"
                app:month_view_scrollable="true"
                app:select_mode="single_mode"
                app:selected_text_color="#FFFFFF"
                app:selected_theme_color="#2079FF" />

实现点击(<>)左右箭头实现左右翻页功能

可分别调用scrollToPre()、scrollToNext()方法,日历布局设置都在这个类CalendarView.java,里面会有获取当天、获取本月、设置月视图是否可滚动等基本属性和回调接口,都能在该类找到,里面也都是中文注释比较方便翻看。

//滚动到上一个月
 mCalendarView.scrollToPre();

 //滚动到下一个月
 mCalendarView.scrollToNext();
实现左右滑动切换月份实时显示当前年月

只需继承CalendarView.OnMonthChangeListener的

 @Override
    public void onMonthChange(int year, int month) {
        if (mYears != null) mYears.setText(year + "年" + month + "月");
    }


注意:记得添加calendarView.setOnMonthChangeListener(this)

如果需要监听日历选中的日期有哪些,可以继承 CalendarView.OnCalendarMultiSelectListener

注意:记得添加CalendarView.setOnCalendarMultiSelectListener(this)

可以在如下方法内获取到选中的日期

    @Override
    public void onCalendarMultiSelect(com.haibin.calendarview.Calendar calendar, int curSize, int maxSize) {
        //获取选中的日期
        int day = calendar.getDay();
        int month = calendar.getMonth();
    }

设置今天之后的日期不选中,继承CalendarView.OnCalendarInterceptListener(select_mode要设置成支持拦截)

onCalendarIntercept返回true就表示不可选中,反之亦然。
    @Override
    public boolean onCalendarIntercept(com.haibin.calendarview.Calendar calendar) {
        //获取日历上选中的日、月、年
        int day = calendar.getDay();
        int month = calendar.getMonth();
        int year = calendar.getYear();
        //获取当前日期的日、月、年
        int day1 = mCalendarView.getCurDay();
        int month1 = mCalendarView.getCurMonth();
        int year1 = mCalendarView.getCurYear();
        mIsClickable = year < year1 || (year == year1 && (month < month1 || (month == month1 && day < day1)));
        return mIsClickable;
    }

    @Override
    public void onCalendarInterceptClick(com.haibin.calendarview.Calendar calendar, boolean isClick) {
        ToastManager.getInstance().showToast((isClick ? "不能选择小于当前日期" : "无效日期"));
    }

完成。

  • 26
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
GitHub是一个面向开源及私有软件项目的托管平台,它提供了版本控制、协作功能和项目管理工具。使用GitHub开源代码可以按照以下步骤进行: 1. 注册GitHub账号:首先,你需要在GitHub上注册一个账***按照指引填写相关信息完成注册。 2. 浏览开源代码:在GitHub上,你可以通过搜索功能或者浏览各种分类来找到感兴趣的开源代码。你可以使用关键词搜索,也可以浏览GitHub上的热门项目或者各种编程语言的排行榜。 3. 克隆代码:当你找到一个感兴趣的开源代码后,你可以通过克隆(Clone)操作将代码复制到本地。在代码页面上,点击绿色的"Code"按钮,然后选择合适的克隆方式(HTTPS或者SSH),复制克隆链接。 4. 安装Git:Git是一个分布式版本控制系统,你需要在本地安装Git才能进行代码的克隆和管理。访问Git官网(https://git-scm.com/),下载适合你操作系统的安装包,并按照指引完成安装。 5. 克隆代码:打开命令行终端(或者使用Git GUI工具),进入你想要存放代码的目录,执行以下命令克隆代码: ``` git clone 克隆链接 ``` 克隆链接是你在第3步中复制的链接。 6. 使用代码:克隆完成后,你就可以在本地使用这个开源代码了。你可以根据代码的说明文档或者README文件了解如何使用和配置代码。 7. 提交修改:如果你对代码进行了修改或者添加了新功能,你可以使用Git提交(Commit)这些修改。在代码目录下执行以下命令: ``` git add . git commit -m "提交说明" ``` 这样就将修改提交到本地的版本控制系统中了。 8. 推送修改:如果你希望将修改推送(Push)到GitHub上,使其他人也能看到你的贡献,执行以下命令: ``` git push origin 分支名 ``` 分支名是你要推送的分支名称,默认为"master"。 以上是使用GitHub开源代码的基本步骤。当然,具体的操作可能会因为不同的代码而有所差异,你可以根据每个代码的说明文档或者README文件来了解更多细节。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值