在android

时间:2015-06-07 11:35:48

标签: android caldroid

我正在使用CaldroidFragment申请。现在我尝试使用

设置特定日期的背景颜色
CaldroidFragment.setBackgroundResourceForDate(int backgroundRes,
                                     java.util.Date date);

功能。现在,如果我从xml传递资源,比如R.color.blue作为第一个参数,那么它可以工作,但我必须在运行时将动态颜色值作为背景传递。我在一个范围内动态生成颜色(类似于插值)。现在我正在尝试使用getResources()。getColor()函数将我的颜色转换为资源。

private static final int COLOR_END = Color.parseColor("#BD4141");
private static final int COLOR_START = Color.parseColor("#69A864");



mCaldroidFragment.setBackgroundResourceForDate(
                        getResources().getColor(getInterPolateColor(2)),
                        new Date());


private int getInterPolateColor(int value) {
            return Utility.interpolateColor(COLOR_START, COLOR_END, value / (float) 15);
}



public static int interpolateColor(final int startColor, final int endColor, final float proportion) {
            final float[] hsva = new float[3];
            final float[] hsvb = new float[3];
            Color.colorToHSV(startColor, hsva);
            Color.colorToHSV(endColor, hsvb);
            for (int i = 0; i < 3; i++) {
                hsvb[i] = interpolate(hsva[i], hsvb[i], proportion);
            }
            return Color.HSVToColor(hsvb);
}



private static float interpolate(final float a, final float b, final float proportion) {
            return (a + ((b - a) * proportion));
}

但它显示以下错误

 android.content.res.Resources$NotFoundException: Resource ID #0xff79ab60
            at android.content.res.Resources.getValue(Resources.java:1123)
            at android.content.res.Resources.getColor(Resources.java:805)

现在可以从颜色值创建背景资源,它将像R.color.xxx一样,或任何解决方案来解决我的问题。

2 个答案:

答案 0 :(得分:1)

阅读源代码后,我认为还有其他选择,然后更改源代码以支持颜色,而不仅仅是资源/

答案 1 :(得分:1)

据我所知,没有办法在运行时动态更改R项(R.color,R.id等)。这些资源是在构建时从您的xml(和其他静态)资源编译的。

另外,根据CaldroidFragment GitHub readme,看起来你确实希望在xml中定义自定义颜色:

  

要使用这些方法,您应该在color.xml和中定义颜色   可绘制文件夹中的背景:

caldroidFragment.setBackgroundResourceForDate(R.color.blue, blueDate);
caldroidFragment.setBackgroundResourceForDate(R.color.green, greenDate);

所以,简短的回答似乎是,不,你不能动态设置你的颜色。

我唯一的建议是,如果你能想出一种覆盖/超载setBackgroundResourceForDate()的方法,那么最好传递一个可绘制资源而不是背景颜色。这样,您就可以动态调整drawable(颜色,图像,形状等),同时保持相同的R.id和名称。