Intereting Posts
Можем ли мы получить доступ к микрофонному драйверу моего телефона Android Как я должен кодировать, чтобы противостоять «одноразовому пиратству»? Есть ли Android-эмулятор Google Glass? android.Settings.Secure.ANDROID_ID Добавление параметра предпочтения в фрагментарный элемент FragmentPagerAdapter Android получить и разобрать Google Directions Logcat не работает в студии Android Отображение виджета пользовательского интерфейса в Cardview в android L Устанавливайте приложения без помощи разрешения INSTALL_PACKAGES Андроид Фрагмент и изменение ориентации, вызывающие: IllegalStateException: Не удается выполнить это действие после onSaveInstanceState Можно ли делать настоящие HTTP-запросы с robolectric Android – listview получить представление позиции по позиции Android-приложение сразу после загрузки Отображение веб-представления «Android WebCore в этом случае не поддерживается» Предупреждение Eclipse не имеет java doc для отображения информации о классе и методах. Как их прикрепить? + андроид

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