Quels sont les moyens de générer par programme des jeux de couleurs de Material Design?

J’essaie de créer une palette de couleurs de Material Design qui modifie la luminosité / luminosité en pourcentage avec une couleur hexadécimale quelconque. En ce qui concerne l’implémentation, j’ai constaté qu’il y a des hexagones de couleur que je ne peux pas générer et affiche une exception inconnue. Pouvez-vous me dire quelles sont les alternatives ou les précautions techniques pour générer cet ensemble de couleurs?

entrez la description de l'image ici Voici mon code

package com.example.dino.util; import android.content.Context; import android.graphics.Color; import java.util.ArrayList; /** * Created by larrylo on 18/1/15. */ public class ColorUtils { public Context context; public static float[] colorToHsl(Ssortingng hexColor) { int color = Color.parseColor(hexColor); float r = ((0x00ff0000 & color) >> 16) / 255.0F; float g = ((0x0000ff00 & color) >> 8) / 255.0F; float b = ((0x000000ff & color)) / 255.0F; float max = Math.max(Math.max(r, g), b); float min = Math.min(Math.min(r, g), b); float c = max - min; float hTemp = 0.0F; if (c == 0) { hTemp = 0; } else if (max == r) { hTemp = (float) (g - b) / c; if (hTemp < 0) hTemp += 6.0F; } else if (max == g) { hTemp = (float) (b - r) / c + 2.0F; } else if (max == b) { hTemp = (float) (r - g) / c + 4.0F; } float h = 60.0F * hTemp; float l = (max + min) * 0.5F; float s; if (c == 0) { s = 0.0F; } else { s = c / (1 - Math.abs(2.0F * l - 1.0F)); } float [] hsl = {h , s , l } ; return hsl; } public static String hslToColor(int alpha, float hue, float saturation, float lightness) { float hh = hue; float ss = saturation; float ll = lightness; float h, s, v; h = hh; ll *= 2; ss *= (ll <= 1) ? Ll : 2 - ll; v = (ll + ss) / 2; s = ((ll + ss) != 0) ? (2 * ss) / (ll + ss) : 0; int resultColorInt = Color.HSVToColor(alpha, new float[] { h, s, v }); return Integer.toHexString(resultColorInt).toUpperCase(); } public static ArrayList returnMaterialDesignColorSet (Ssortingng colorHex){ ArrayList resultList = new ArrayList(); float [] baseColorHSL = colorToHsl(colorHex); double randomMid = randomWithRange(0.48 , 0.52); Ssortingng baseColor = hslToColor(1 ,baseColorHSL[0] , baseColorHSL[1] , (float)0.5); resultList.add(baseColor); return resultList; } public static double randomWithRange(double min, double max) { double range = Math.abs(max - min); return (Math.random() * range) + (min <= max ? Min : max); } public static int colorInt (String hex){ return Color.parseColor(hex); } } 

Code pour tester

  ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); double max = 0.52; double min = 0.48; double range = Math.abs(max - min); double value = (Math.random() * range) + (min <= max ? Min : max); float result = (float)value; System.out.println(result); String test = "#973f5c"; String test2 = ColorUtils.returnMaterialDesignColorSet(test).get(0); int colorInt = ColorUtils.colorInt(test2); actionBar .setBackgroundDrawable(new ColorDrawable(colorInt)); 

Problème d’origine

Votre code a une erreur de travail avec le format de couleur. Remplacez la dernière ligne de hslToColor() comme indiqué ci-dessous et vous la ferez fonctionner sans erreur:

 public static Ssortingng hslToColor(int alpha, float hue, float saturation, float lightness) { ... // !!! ERROR WAS ON THE LAST LINE: return Ssortingng.format("#%08x", resultColorInt).toUpperCase(); } 

Je l’ai testé – ça marche – parce que ça fait 2 choses supplémentaires:
1) La valeur des formats doit avoir 8 chiffres
2) Ajoute le préfixe ” #

Deuxième problème possible dans votre code

La valeur alpha peut avoir des valeurs allant de 0 (transparent) à 255 (opaque). Si vous voulez avoir une image opaque, vous devez passer 255 (0xFF).
Maintenant, vous passez 1 et je pense que c’est une erreur – parce que c’est presque transparent.
Donc, pour avoir la couleur opaque remplacer la ligne

 Ssortingng baseColor = hslToColor(1 ,baseColorHSL[0] , baseColorHSL[1] , (float)0.5); 

avec

 Ssortingng baseColor = hslToColor(0xFF ,baseColorHSL[0] , baseColorHSL[1] , (float)0.5); 

Annexe
Si l’on a besoin d’un ensemble de couleurs, il faut faire preuve de créativité.
Pour créer une palette de teintes, vous devez modifier une boucle a) saturation ou b) luminosité ou c) les deux.
Voici un exemple d’implémentation qui renvoie une palette basée sur un changement de luminosité de 0,4 à 0,6 (non inclus) en 10 étapes.
“Expérimental” signifie que vous devez trouver des valeurs pour vous-même.

 public static ArrayList returnMaterialDesignColorSet(Ssortingng baseColorHex, int colorCount) { ArrayList resultList = new ArrayList(); float [] baseColorHSL = colorToHsl(baseColorHex); float lght=0.4;// initial lightness value (experimental) float lStep=(0.6 - lght) / colorCount; // step to go up to 0.6 lightness (experimental) for (int i = 0; i < colorCount; i++) { String baseColor = hslToColor(1 ,baseColorHSL[0] , baseColorHSL[1] , lght); resultList.add(baseColor); lght += lStep; } return resultList; } 

Le problème est dans les lignes suivantes:

 int resultColorInt = Color.HSVToColor(alpha, new float[] { h, s, v }); return Integer.toHexSsortingng(resultColorInt).toUpperCase(); 

Lorsque la valeur alpha est inférieure à 16 (0xF0), elle n’occupera qu’un seul caractère de la chaîne:

 // 1-char alpha int resultColorInt = Color.HSVToColor(1, new float[]{340, 0.7f, 0.5f}); Ssortingng result = Integer.toHexSsortingng(resultColorInt).toUpperCase(); // result == "1802644" - 7 chars, which is invalid color format 

Vous devez compenser les alphas 1 caractère ou 0 caractère (dans la plage 0-15) en ajoutant 0 au début de la chaîne résultante:

 // not the best code, but works while (result.length() < 8) { result = "0" + result; } // don't forget # to make it a legal color result = "#" + result; return result; 

Cependant, la meilleure chose à faire serait d'éviter complètement les ficelles. Utilisez plutôt ints - elles contiennent les mêmes données avec de meilleures performances. Pour votre commodité, dans le débogueur, vous pouvez modifier les éléments à afficher dans HEX, au lieu de DEC (dans Android Studio: clic droit dans la vue Variables, Afficher en tant que -> HEX).