Android 大姨妈、经期日历,美柚经期效果

项目中最近有用到记录女性经期的功能,类似于美柚经期日历效果,然后找遍了都没找到,无奈只能自己写了。

为了节约时间和成本,直接是基于三方开源日历库修改的。

三方开源库: CalendarView  超级好用,自定义程度高,强烈推荐~~

可参考文档:CalendarView文档

效果图

效果图

 

前言:

看了文档和介绍你就知道,你只要关心如何将你要的效果(例如颜色、标记等)显示在日历上面就行了,其他的已经帮你处理好了,你只需要通过Canvas绘制出来就行了,坐标也都计算好了。

分析:

新建类继承MonthView(月视图),分别实现:

onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme)

onDrawScheme(Canvas canvas, Calendar calendar, int x, int y)

onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme,boolean isSelected)

三个方法对应的是:选中效果、标记效果、文本效果

可以看出他已经返回了坐标和Canvas对象,所以我们只要根据需要绘制就行了。例如我们要日期被选中时设置它的背景颜色,那么我们只要在onDrawSelected()方法中去绘制,下面是代码示例(这里是绘制了一个矩形):

   /**
     * @param mSelectedPaint 被选择的日期背景色画笔
     * @param mPadding 设置间距
     * @param mItemWidth 每一项的宽度
     *  绘制选中效果示例
     */
    @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;
    }

其他的也是同理,根据需要进行绘制。

对于经期日历来说,它分为安全期、排卵期、易孕期、月经期等等,我们就需要针对不同月经日期绘制不同的背景颜色,用于区分,如安全期时,颜色为绿色,月经期时就为粉色.....

所以我们就只要知道它哪一天为安全期、哪一天为易孕期,然后绘制不同的颜色就行了。

这里的话我给出两种方式,可以自行权量:

1、直接依赖他的库,不作任何修改,然后依据他的标记字段 scheme 作为日期类别区分

他有一个方法calendar.setScheme(String scheme),就是用来设置标记字段的,你可以将这个字段用来显示在日历上,如果你不需要在日历上显示额外的标记信息,那你就可以将此字段作为日期类别来用。(本文的示例代码就是通过此方式来使用的)

    //部分代码示例(根据Scheme字段来判断,period为月经期  ovulation排卵日)
    @Override
    protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) {
        if ("period".equals(calendar.getScheme())) {//月经期绘制粉色背景
            canvas.drawRect(x + mPadding, y + mPadding, x + mItemWidth - mPadding, y + mItemHeight - mPadding, mSchemePaint);
            return;//减少判断
        }
        if ("ovulation".equals(calendar.getScheme())) {//排卵期有特别标示(底部小横线)
            mPointPaint.setColor(0xFFE4CFFB);
            canvas.drawRect(x + mItemWidth / 2 - mW / 2,
                    y + mItemHeight - mH * 2 - mPadding,
                    x + mItemWidth / 2 + mW / 2,
                    y + mItemHeight - mH - mPadding, mPointPaint);
        }
    }

2、导入他的库,进行修改

我们可以仿照他的标记scheme字段,添加一个自己的标记字段,如下图:

    public String getScheme() {
        return scheme;
    }
    //设置标记(他的方法)
    public void setScheme(String scheme) {
        this.scheme = scheme;
    }
    public int getSchemeType() {
        return schemeType;
    }
    //设置类别(自己添加的方法)
    public void setSchemeType(int schemeType) {
        this.schemeType = schemeType;
    }

然后依次修改下面三个类中的三个方法:

Calendar类:  mergeScheme(Calendar calendar, String defaultScheme)

final void mergeScheme(Calendar calendar, String defaultScheme) {
        if (calendar == null)
            return;
        setScheme(TextUtils.isEmpty(calendar.getScheme()) ?
                defaultScheme : calendar.getScheme());
        setSchemeColor(calendar.getSchemeColor());
        setSchemeType(calendar.getSchemeType());//设置类别(自己添加的)
        setSchemes(calendar.getSchemes());
    }

CalendarViewDelegate类: addSchemesFromMap(List<Calendar> mItems)

 final void addSchemesFromMap(List<Calendar> mItems) {
        if (mSchemeDatesMap == null || mSchemeDatesMap.size() == 0) {
            return;
        }
        for (Calendar a : mItems) {
            if (mSchemeDatesMap.containsKey(a.toString())) {
                Calendar d = mSchemeDatesMap.get(a.toString());
                a.setScheme(TextUtils.isEmpty(d.getScheme()) ? getSchemeText() : d.getScheme());
                a.setSchemeColor(d.getSchemeColor());
                a.setSchemeType(d.getSchemeType());//设置类别(自己添加的)
                a.setSchemes(d.getSchemes());
            } else {
                a.setScheme("");
                a.setSchemeColor(0);
                a.setSchemeType(0);//设置类别(自己添加的)
                a.setSchemes(null);
            }
        }
    }

BaseView类: addSchemesFromMap()

final void addSchemesFromMap() {
        if (mDelegate.mSchemeDatesMap == null || mDelegate.mSchemeDatesMap.size() == 0) {
            return;
        }
        for (Calendar a : mItems) {
            if (mDelegate.mSchemeDatesMap.containsKey(a.toString())) {
                Calendar d = mDelegate.mSchemeDatesMap.get(a.toString());
                a.setScheme(TextUtils.isEmpty(d.getScheme()) ? mDelegate.getSchemeText() : d.getScheme());
                a.setSchemeColor(d.getSchemeColor());
                a.setSchemeType(d.getSchemeType());//设置类别(自己添加的)
                a.setSchemes(d.getSchemes());
            } else {
                a.setScheme("");
                a.setSchemeColor(0);
                a.setSchemeType(0);//设置类别(自己添加的)
                a.setSchemes(null);
            }
        }
    }

修改完成后,我们只需在设置数据的时候将类别填写进去,然后绘制的时候根据我们设置的SchemeType字段去分区日期,然后对应绘制就行了。

更多细节可参考示例Demo或者CalendarView文档

Github直达链接

欢迎Start或提issues!

### 回答1: calendarview控件是Android中自带的一个日历控件,可以展示日历的月份、日期等信息。美柚App是一款备孕怀孕期的助手应用,其中的孕期日历是非常重要的功能之一。通过对比美柚App孕期日历和calendarview控件的属性,可以轻松地仿制出类似的孕期日历功能。 首先,需要修改calendarview控件的样式和颜色,使其更接近美柚App的设计风格。可以通过修改控件的属性和调整资源文件中的样式来实现。 其次,需要添加日期的标注和提示信息,例如月经期、排卵期、预计分娩日期等。该功能可以通过在calendarview中设置特定日期的标记和点击事件来实现。 最后,需要实现在孕期日历中显示当天是否受孕、孕周数、宝宝大小等信息。这需要在代码中进行计算,根据用户输入的信息和当前时间来动态展示相应的信息。可以通过创建一个类来处理计算和展示相关信息的逻辑,并将其与calendarview控件关联起来。 综上所述,仿制美柚App的孕期日历需要对calendarview控件的样式、功能和计算逻辑进行修改和扩展。通过合理地利用已有的控件和资源,可以轻松地实现一个类似的应用。 ### 回答2: calendarview控件是Android开发中常用的日历选择控件,它可以以日历的形式展示日期,并允许用户通过手势或点击选择日期,常见的属性包括日期的显示格式、日期的范围、当前选中日期等。在美柚app中,有一个孕期日历模块,用户可以通过这个模块记录自己的孕期信息,包括日期、孕周、体重、胎动等,通过分析这些信息,可以为用户提供个性化的孕期建议和咨询服务。 在实现类似美柚app孕期日历的功能时,我们可以使用calendarview控件来展示日期,并通过自定义布局和样式来实现不同的日期显示效果。比如,为了突出当前选中日期,我们可以通过设置选中日期的背景色或添加高亮边框来实现。为了支持选择日期范围,我们可以通过设置日期的最小值和最大值来限制用户选择的日期。同时,为了展示孕周和其他信息,我们可以自定义日期的布局,将孕周等信息与日期一起展示,从而更方便用户使用和理解。 除了上述基本的属性和布局方案,我们还可以通过添加动画效果、支持多语言等方式优化用户体验,从而让我们的控件更加实用和易用。总之,calendarview控件在实现类似美柚app孕期日历的功能时,具有很大的优势和灵活性,在开发中需要根据实际需求进行具体的调整和优化,以达到最佳的用户体验和效果
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值