Intereting Posts

Как получить программный список цветов из градиента на 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); 

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

Благодаря!

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

Вы не можете получить эти значения непосредственно из 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); }