com.haibin.calendarview.CalendarView使用

本文详细介绍了如何在Android项目中使用CustomMonthView和CustomWeekView自定义日历视图,包括依赖引入、自定义组件的代码实现和相关属性配置。涉及dp转px、颜色设置、文本绘制和日期选择等功能。

1.项目地址

项目地址
大致样子

2.步骤

1.依赖

//日历calendar
    implementation 'com.haibin:calendarview:3.6.8'

2.自定义CustomMonthView

/**
 * 演示一个变态需求的月视图
 * Created by huanghaibin on 2018/2/9.
 */

public class CustomMonthView extends MonthView {
   
   

    private int mRadius;

    /**
     * 自定义魅族标记的文本画笔
     */
    private Paint mTextPaint = new Paint();


    /**
     * 24节气画笔
     */
    private Paint mSolarTermTextPaint = new Paint();

    /**
     * 背景圆点
     */
    private Paint mPointPaint = new Paint();

    /**
     * 今天的背景色
     */
    private Paint mCurrentDayPaint = new Paint();

    /**
     * 圆点半径
     */
    private float mPointRadius;

    private int mPadding;

    private float mCircleRadius;
    /**
     * 自定义魅族标记的圆形背景
     */
    private Paint mSchemeBasicPaint = new Paint();

    private float mSchemeBaseLine;

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

        mTextPaint.setTextSize(dipToPx(context, 8));
        mTextPaint.setColor(0xffffffff);
        mTextPaint.setAntiAlias(true);
        mTextPaint.setFakeBoldText(true);


        mSolarTermTextPaint.setColor(0xff489dff);
        mSolarTermTextPaint.setAntiAlias(true);
        mSolarTermTextPaint.setTextAlign(Paint.Align.CENTER);

        mSchemeBasicPaint.setAntiAlias(true);
        mSchemeBasicPaint.setStyle(Paint.Style.FILL);
        mSchemeBasicPaint.setTextAlign(Paint.Align.CENTER);
        mSchemeBasicPaint.setFakeBoldText(true);
        mSchemeBasicPaint.setColor(Color.WHITE);


        mCurrentDayPaint.setAntiAlias(true);
        mCurrentDayPaint.setStyle(Paint.Style.FILL);
        mCurrentDayPaint.setColor(0xFFeaeaea);

        mPointPaint.setAntiAlias(true);
        mPointPaint.setStyle(Paint.Style.FILL);
        mPointPaint.setTextAlign(Paint.Align.CENTER);
        mPointPaint.setColor(Color.RED);

        mCircleRadius = dipToPx(getContext(), 7);

        mPadding = dipToPx(getContext(), 3);

        mPointRadius = dipToPx(context, 2);

        Paint.FontMetrics metrics = mSchemeBasicPaint.getFontMetrics();
        mSchemeBaseLine = mCircleRadius - metrics.descent + (metrics.bottom - metrics.top) / 2 + dipToPx(getContext(), 1);
    }


    @Override
    protected void onPreviewHook() {
   
   
        mSolarTermTextPaint.setTextSize(mCurMonthLunarTextPaint.getTextSize());
        mRadius = Math.min(mItemWidth, mItemHeight) / 11 * 5;
    }


    @Override
    protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) {
   
   
        int cx = x + mItemWidth / 2;
        int cy = y + mItemHeight / 2;
        canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
        return true;
    }

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

        boolean isSelected = isSelected(calendar);
        if (isSelected) {
   
   
            mPointPaint.setColor(Color.WHITE);
        } else {
   
   
            mPointPaint.setColor(Color.GRAY);
        }

        canvas.drawCircle(x + mItemWidth / 2, y + mItemHeight - 3 * mPadding, mPointRadius, mPointPaint);
    }

    @SuppressWarnings("IntegerDivisionInFloatingPointContext")
    @Override
    protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) {
   
   
        int cx = x + mItemWidth / 2;
        int cy = y + mItemHeight / 2;
        int top = y - mItemHeight / 6;

        if (calendar.isCurrentDay() && !isSelected) {
   
   
            canvas.drawCircle(cx, cy, mRadius, mCurrentDayPaint);
        }

        if (hasScheme) {
   
   
            canvas.drawCircle(x + mItemWidth - mPadding - mCircleRadius / 2, y + mPadding + mCircleRadius, mCircleRadius, mSchemeBasicPaint);
            mTextPaint.setColor(calendar.getSchemeColor());
            canvas.drawText(calendar.getScheme(), x + mItemWidth - mPadding - mCircleRadius, y + mPadding + mSchemeBaseLine, mTextPaint);
        }

        //当然可以换成其它对应的画笔就不麻烦,
        if (calendar.isWeekend() && calendar.isCurrentMonth()) {
   
   
            mCurMonthTextPaint.setColor(0xFF489dff);
            mCurMonthLunarTextPaint.setColor(0xFF489dff);
            mSchemeTextPaint.setColor(0xFF489dff);
            mSchemeLunarTextPaint.setColor(0xFF489dff);
            mOtherMonthLunarTextPaint.setColor(0xFF489dff);
            mOtherMonthTextPaint.setColor(0xFF489dff)</
当在 Android Studio 中遇到 'Could not find com.haibin:calendarview:3.6.0' 错误时,通常是由于依赖项无法在指定的仓库中找到。可以尝试以下方法解决: ### 检查仓库配置 确保项目的 `build.gradle` 文件中包含了正确的仓库配置。一般来说,需要添加 JCenter 或 Maven Central 仓库。在项目根目录的 `build.gradle` 文件中添加以下内容: ```groovy allprojects { repositories { google() mavenCentral() // 如果需要,也可以添加 JCenter // jcenter() } } ``` ### 同步 Gradle 有时候,简单的 Gradle 同步就能解决问题。在 Android Studio 中,点击工具栏上的 "Sync Now" 按钮,或者通过 "File" -> "Sync Project with Gradle Files" 来同步项目。 ### 检查版本号 确认 `com.haibin:calendarview` 的版本号 `3.6.0` 是否存在。可以到 Maven Central 或 JCenter 等仓库网站上搜索该库,查看可用的版本。如果版本号有误,可以在 `build.gradle` 文件中修改为正确的版本号,例如: ```groovy dependencies { implementation 'com.haibin:calendarview:正确的版本号' } ``` ### 清除缓存并重新构建 清除 Android Studio 的缓存和临时文件,然后重新构建项目。可以通过以下步骤清除缓存: 1. 关闭 Android Studio。 2. 找到 Android Studio 的缓存目录,一般在 `~/.gradle/caches` 或 `C:\Users\你的用户名\.gradle\caches`。 3. 删除该目录下的所有文件。 4. 重新打开 Android Studio,重新构建项目。 ### 检查网络连接 确保你的网络连接正常,能够访问 Maven Central 或 JCenter 等仓库。如果网络存在问题,可能会导致依赖项无法下载。 ### 手动添加依赖 如果以上方法都无法解决问题,可以尝试手动下载 `com.haibin:calendarview:3.6.0` 的 `.aar` 或 `.jar` 文件,然后将其添加到项目的 `libs` 目录下。在 `build.gradle` 文件中添加以下依赖: ```groovy dependencies { implementation files('libs/calendarview-3.6.0.aar') } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值