Быстрый способ - использовать AvoidXfermode , чтобы перекрасить только те цвета, которые вы хотите изменить, - тогда вы можете переключаться между любыми цветами, которые вы хотите. Вам просто нужно сделать что-то вроде этого:
// will change red to green
Paint change1 = new Paint();
change1.setColor(Color.GREEN);
change1.setXfermode(new AvoidXfermode(Color.RED, 245, AvoidXfermode.Mode.TARGET));
Canvas c = new Canvas();
c.setBitmap(chart);
c.drawRect(0, 0, width, height, change1);
// rinse, repeat for other colors
Возможно, вам придется поиграть с допуском для AvoidXfermode
, но это должно сделать то, что вы хотите, намного быстрее, чем расчёт на пиксель. Кроме того, убедитесь, что изображение диаграммы находится в режиме ARGB8888. По умолчанию Android имеет тенденцию работать с изображениями в режиме RGB565, что приводит к путанице в вычислениях цветов, которые вы хотите использовать - чтобы быть уверенным, вы можете убедиться, что ваше изображение находится в режимах ARGB8888 и , изменяемых с помощью вызов Bitmap chart = chartFromServer.copy(Config.ARGB_8888, true);
перед настройкой Xfermode.
Уточнение : чтобы изменить другие цвета, вам не нужно будет заново загружать изображения заново, вам просто нужно создать другие краски с соответствующими цветами, которые вы хотите изменить, например так:
// changes green to red
Paint change1 = new Paint();
change1.setColor(Color.GREEN);
change1.setXfermode(new AvoidXfermode(Color.RED, 245, AvoidXfermode.Mode.TARGET));
// changes white to blue
Paint change2 = new Paint();
change2.setColor(Color.BLUE);
change2.setXfermode(new AvoidXfermode(Color.WHITE, 245, AvoidXfermode.Mode.TARGET));
// ... other Paints with other changes you want to apply to this image
Canvas c = new Canvas();
c.setBitmap(chart);
c.drawRect(0, 0, width, height, change1);
c.drawRect(0, 0, width, height, change2);
//...
c.drawRect(0, 0, width, height, changeN);