android 在运行时创建具有动态颜色的背景资源
Create a background resource with dynamic color at runtime in android
我正在为我的应用程序使用 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,或解决我的问题的任何解决方案。
阅读源代码后,我认为没有其他选择可以更改源代码以支持颜色,而不仅仅是资源/
据我所知,无法在运行时动态更改 R 项(R.color、R.id 等)。这些资源是在构建时从您的 xml(和其他静态)资源编译的。
此外,根据 CaldroidFragment GitHub readme,看起来您确实需要在 xml:
中定义自定义颜色
To use these methods, you should define your colors in color.xml and
background in drawable folder:
caldroidFragment.setBackgroundResourceForDate(R.color.blue, blueDate);
caldroidFragment.setBackgroundResourceForDate(R.color.green, greenDate);
所以,简短的回答似乎是,不,您不能动态设置颜色。
我唯一的建议是,如果你能想出办法 override/overload setBackgroundResourceForDate()
,最好传入可绘制资源而不是背景颜色。这样,您就可以动态调整可绘制对象(颜色、图像、形状等),同时仍保持相同的 R.id 和名称。
我正在为我的应用程序使用 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,或解决我的问题的任何解决方案。
阅读源代码后,我认为没有其他选择可以更改源代码以支持颜色,而不仅仅是资源/
据我所知,无法在运行时动态更改 R 项(R.color、R.id 等)。这些资源是在构建时从您的 xml(和其他静态)资源编译的。
此外,根据 CaldroidFragment GitHub readme,看起来您确实需要在 xml:
中定义自定义颜色To use these methods, you should define your colors in color.xml and background in drawable folder:
caldroidFragment.setBackgroundResourceForDate(R.color.blue, blueDate); caldroidFragment.setBackgroundResourceForDate(R.color.green, greenDate);
所以,简短的回答似乎是,不,您不能动态设置颜色。
我唯一的建议是,如果你能想出办法 override/overload setBackgroundResourceForDate()
,最好传入可绘制资源而不是背景颜色。这样,您就可以动态调整可绘制对象(颜色、图像、形状等),同时仍保持相同的 R.id 和名称。