Как получить программный список цветов из градиента на Android

В Android я хотел бы нарисовать PieChart с динамическим количеством пирогов. Каждый пирог должен иметь другой цвет от градиента.

Например, я хотел бы иметь градиент от светло-коричневого до темно-коричневого. Если мне нужно нарисовать пять пирогов, мне нужно пятью слоями от начала до конца этого градиента.

Как я могу это сделать на Java с каркасом Android?

Я узнал, что я могу создать LinearGradient для строки, то есть:

LinearGradient lg = new LinearGradient(1, 1, 5, 5, toRGB("lightbrown"), toRGB("darkbrown"), TileMode.REPEAT); 

Но я не нашел никакой функции, чтобы получить цвет из этой строки, то есть:

 // for the five needed RGB colors from the gradient line lg.getRGBColor(1, 1); lg.getRGBColor(2, 2); lg.getRGBColor(3, 3); lg.getRGBColor(4, 4); lg.getRGBColor(5, 5); 

У вас есть идеи, как я могу это получить?

Благодаря!

Вы не можете получить эти значения непосредственно из LinearGradient. Градиент не содержит фактического чертежа. Чтобы получить эти значения, вы можете нарисовать их на холсте и вытащить цвета из холста, или то, что я предлагаю, – это рассчитать ценности самостоятельно.

Это повторяющийся линейный градиент в пять шагов, и у вас есть значения RGB для первого и последнего цвета. Остальное – просто математика. Вот псевдокод:

 int r1 = startColor.red; int g1 = startColor.green; int b1 = startColor.blue; int r2 = endColor.red; int g2 = endColor.green; int b2 = endColor.blue; int redStep = r2 - r1 / 4; int greenStep = g2 - g1 / 4; int blueStep = b2 - b1 / 4; firstColor = new Color(r1, g1, b1); secondColor = new Color(r1 + redStep, g1 + greenStep, b1 + blueStep); thirdColor = new Color(r1 + redStep * 2, g1 + greenStep * 2, b1 + blueStep * 2); fourthColor = new Color(r1 + redStep * 3, g1 + greenStep * 3, b1 + blueStep * 3); fifthColor = new Color(r1 + redStep * 4, g1 + greenStep * 4, b1 + blueStep * 4); 

Другой подход, который немного более многократно используется (я, кажется, все время сталкиваюсь с этой проблемой). Это немного больше кода. Вот использование:

  int[] colors = {toRGB("lightbrown"), toRGB("darkbrown")};//assuming toRGB : String -> Int float[] positions = {1, 5}; getColorFromGradient( colors, positions, 1 ) //... getColorFromGradient( colors, positions, 5 ) 

Вспомогательные функции

 public static int getColorFromGradient(int[] colors, float[] positions, float v ){ if( colors.length == 0 || colors.length != positions.length ){ throw new IllegalArgumentException(); } if( colors.length == 1 ){ return colors[0]; } if( v <= positions[0]) { return colors[0]; } if( v >= positions[positions.length-1]) { return colors[positions.length-1]; } for( int i = 1; i < positions.length; ++i ){ if( v <= positions[i] ){ float t = (v - positions[i-1]) / (positions[i] - positions[i-1]); return lerpColor(colors[i-1], colors[i], t); } } //should never make it here throw new RuntimeException(); } public static int lerpColor( int colorA, int colorB, float t){ int alpha = (int)Math.floor(Color.alpha(colorA) * ( 1 - t ) + Color.alpha(colorB) * t); int red = (int)Math.floor(Color.red(colorA) * ( 1 - t ) + Color.red(colorB) * t); int green = (int)Math.floor(Color.green(colorA) * ( 1 - t ) + Color.green(colorB) * t); int blue = (int)Math.floor(Color.blue(colorA) * ( 1 - t ) + Color.blue(colorB) * t); return Color.argb(alpha, red, green, blue); }