在MaterialCalendarView中使用多个DotSpan

时间:2015-10-26 21:16:20

标签: android material-design calendarview

有没有办法将超过1个DotSpan附加到Android MaterialCalendarView的日期? 尽管我在CalendarView中添加了2个DotSpan,它仍然只显示1个DotSpan ... 我使用以下代码:

@Override
public boolean shouldDecorate(CalendarDay day) {
    day.copyTo(calendar);
    for (int i = 0; i < weekDayStrTmp.size(); i++) {
        if (weekDayStrTmp.contains(day)) {
            return true;
        } else {
            return false;
        }
    }
    return false;
}

@Override
public void decorate(DayViewFacade view) {
    view.addSpan(new DotSpan(8, myContext.getResources().getColor(R.color.myColor3)));
    view.addSpan(new DotSpan(8, myContext.getResources().getColor(R.color.myColor3)));
}

2 个答案:

答案 0 :(得分:10)

你用第二个重写第一个DotSpan。 给定的DotSpan类允许您在文本下方创建一个居中的彩色圆点,因此如果您将一个放在另一个上面,则第一个将不可见。

我设法在同一个DayViewFacade视图中创建了几个DotSpans,我不确定这是否是您搜索的确切解决方案,但我确信它会有所帮助:

所以你必须创建一个实现DayViewDecorator 的自定义Decorator类,让我们称之为OrangeDecorator。

您必须创建另一个实现LineBackgroundSpan 的自定义类,我们将其称为MyCustomOrangeSpan。

这两个类与原始库中的原始DotSpan和EventDecorator几乎相同,但您可以根据需要自定义类。

在“装饰”功能(OrangeDecorator类)中使用您的自定义LineBackgroundSpan,如下所示:

@Override
public void decorate(DayViewFacade view) {
    view.addSpan(new MyCustomOrangeSpan(6, ContextCompat.getColor(mContext, R.color.AppOrange)));
}

在“drawBackground”函数(MyCustomOrangeSpan类)中,您将能够将圆圈定位在画布内,所以让我们这样做:

@Override
    public void drawBackground(Canvas canvas, Paint paint, int left, int right, int top, int baseline,
                               int bottom, CharSequence text, int start, int end, int lnum) {

        int oldColor = paint.getColor();
        if (color != 0) {
            paint.setColor(color);
        }

        canvas.drawCircle((left + right) / 2 - 20, bottom + radius, radius, paint);
        paint.setColor(oldColor);

    }

这样,我们可以创建多个DayViewDecorators和LineBackgroundSpan(用于不同的定位):

BlueDecorator blueDecorator = new BlueDecorator(getActivity(),eventsDays,eventsMap);
OrangeDecorator orangeDecorator = new OrangeDecorator(getActivity(),eventsDays,eventsMap);
GreenDecorator greenDecorator = new GreenDecorator(getActivity(),eventsDays,eventsMap);
materialCalendarView.addDecorator(blueDecorator);
materialCalendarView.addDecorator(orangeDecorator);
materialCalendarView.addDecorator(greenDecorator);

答案 1 :(得分:0)

我必须找到一种方法来添加多个点,所选答案肯定帮助我解决了问题:

首先,您需要一个自定义的DotSpan类,它只是稍微改变了一下:

public class CustmMultipleDotSpan implements LineBackgroundSpan {


    private final float radius;
    private int[] color = new int[0];


    public CustmMultipleDotSpan() {
        this.radius = DEFAULT_RADIUS;
        this.color[0] = 0;
    }


    public CustmMultipleDotSpan(int color) {
        this.radius = DEFAULT_RADIUS;
        this.color[0] = 0;
    }


    public CustmMultipleDotSpan(float radius) {
        this.radius = radius;
        this.color[0] = 0;
    }


    public CustmMultipleDotSpan(float radius, int[] color) {
        this.radius = radius;
        this.color = color;
    }

    @Override
    public void drawBackground(
            Canvas canvas, Paint paint,
            int left, int right, int top, int baseline, int bottom,
            CharSequence charSequence,
            int start, int end, int lineNum
    ) {

        int total = color.length > 5 ? 5 : color.length;
        int leftMost = (total - 1) * -10;

        for (int i = 0; i < total; i++) {
            int oldColor = paint.getColor();
            if (color[i] != 0) {
                paint.setColor(color[i]);
            }
            canvas.drawCircle((left + right) / 2 - leftMost, bottom + radius, radius, paint);
            paint.setColor(oldColor);
            leftMost = leftMost + 20;
        }
    }
}

你还需要一个稍微改变过的EventDecorator:

public class EventDecorator implements DayViewDecorator {

    private final int[] colors;
    private final HashSet<CalendarDay> dates;


    public EventDecorator(Collection<CalendarDay> dates, int[] colors) {
        //this.color = color;
        this.dates = new HashSet<>(dates);

        this.colors = colors;

    }


    public EventDecorator(List<MainActivity.Filter> filteredEvents) {
        //this.color = color;

        this.dates = new HashSet<>(filteredEvents.get(0).calDayArr);
        int[] colors = new int[1];
        colors[0] = filteredEvents.get(0).color;
        this.colors = colors;

    }

    @Override
    public boolean shouldDecorate(CalendarDay day) {
        return dates.contains(day);
    }

    @Override
    public void decorate(DayViewFacade view) {

        view.addSpan((new CustmMultipleDotSpan(5,colors)));

    }


}

基本上就是这样。

现在在您的活动中找到您的日历视图,并为其提供一些日期和颜色,以便在这些日期显示。在我的特定情况下,我根据每天的事件数量在5个不同的列表中对日期进行排序,因此您最终会得到类似

的内容。
calendarView.addDecorator(new EventDecorator(threeEventDays,threeColors));

其中threeEventDays是CalendarDay的集合 和threeColors是一个int数组

int[] threeColors = {
Color.rgb(0, 0, 255),
Color.rgb(0, 255, 0),
Color.rgb(255, 0, 0)};

它不应该像它应该的那样理想,但它的作用是它需要一系列颜色。根据数组大小计算最左边的位置,因此对于大小为1,最左边的位置是我们都知道和喜欢的中间点。对于大小2,最左边的位置是-10,对于大小3,它是-20,依此类推。然后循环并画出点。

它仅限于5个事件点,因为它在此之上变得相当丑陋,虽然目前不在我的路线图上,但如果事实证明这是一个要求,我可能会增加对第二行点的支持。