2015-06-07 1 views
0

Я использую CaldroidFragment для моего приложения. Теперь я пытаюсь установить цвет фона конкретной даты с помощьюСоздайте фоновый ресурс с динамическим цветом во время выполнения в android

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, или любое решение, чтобы решить мою проблему.

ответ

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(), было бы лучше передать ресурс с возможностью рисования вместо цвета для фона. Таким образом, вы сможете динамически настраивать выталкиваемый (цвет, изображение, фигуру и т. Д.), Сохраняя при этом одинаковое имя и имя.

+0

setBackgroundResourceForDate() не может восстановить ошибку в моем случае –

1

После прочтения исходного кода я не думаю, что есть другой вариант, то изменение исходного кода для поддержки цветов, а не только ресурсов/