Java 以编程方式生成材质设计颜色集的方法有哪些?
我试图创建一个材料设计的调色板,用任意颜色十六进制改变亮度/亮度的百分比。当谈到实现时,我发现有一些颜色十六进制我无法生成,并显示颜色未知异常。您能告诉我生成这组颜色的替代方案或技术预防措施吗 下面是我的代码Java 以编程方式生成材质设计颜色集的方法有哪些?,java,android,colors,material-design,Java,Android,Colors,Material Design,我试图创建一个材料设计的调色板,用任意颜色十六进制改变亮度/亮度的百分比。当谈到实现时,我发现有一些颜色十六进制我无法生成,并显示颜色未知异常。您能告诉我生成这组颜色的替代方案或技术预防措施吗 下面是我的代码 package com.example.dino.util; import android.content.Context; import android.graphics.Color; import java.util.ArrayList; /** * Created by l
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(String 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<String> returnMaterialDesignColorSet (String colorHex){
ArrayList<String> resultList = new ArrayList<String>();
float [] baseColorHSL = colorToHsl(colorHex);
double randomMid = randomWithRange(0.48 , 0.52);
String 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);
}
}
package com.example.dino.util;
导入android.content.Context;
导入android.graphics.Color;
导入java.util.ArrayList;
/**
*由larrylo于2015年1月18日创建。
*/
公共类颜色{
公共语境;
公共静态浮点[]colorToHsl(字符串hexColor){
int color=color.parseColor(hexColor);
浮点数r=((0x00ff0000&color)>>16)/255.0F;
浮点数g=((0x0000ff00&color)>>8)/255.0F;
浮点b=((0x000000ff&color))/255.0F;
浮点最大值=数学最大值(数学最大值(r,g),b);
float min=Math.min(Math.min(r,g),b);
浮动c=最大-最小值;
浮动hTemp=0.0F;
如果(c==0){
hTemp=0;
}else if(max==r){
hTemp=(浮动)(g-b)/c;
如果(hTemp<0)
hTemp+=6.0F;
}否则,如果(最大==g){
hTemp=(浮动)(b-r)/c+2.0F;
}否则如果(最大==b){
hTemp=(浮动)(r-g)/c+4.0F;
}
浮子h=60.0F*hTemp;
浮子l=(最大+最小)*0.5F;
浮子;
如果(c==0){
s=0.0F;
}否则{
s=c/(1-数学绝对值(2.0F*l-1.0F));
}
float[]hsl={h,s,l};
返回hsl;
}
公共静态字符串hslToColor(整数alpha、浮动色调、浮动饱和度、浮动亮度){
浮动hh=色调;
浮动ss=饱和;
浮动ll=亮度;
浮子h、s、v;
h=hh;
ll*=2;
ss*=(ll问题在于以下几行:
int resultColorInt = Color.HSVToColor(alpha, new float[] { h, s, v });
return Integer.toHexString(resultColorInt).toUpperCase();
当alpha值小于16(0xF0)时,它将只占用字符串中的一个字符:
// 1-char alpha
int resultColorInt = Color.HSVToColor(1, new float[]{340, 0.7f, 0.5f});
String result = Integer.toHexString(resultColorInt).toUpperCase();
// result == "1802644" - 7 chars, which is invalid color format
您需要通过在结果字符串的开头追加0来补偿1字符或0字符的字母(范围为0-15):
// 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;
//不是最好的代码,但很有效
while(result.length()<8){
结果=“0”+结果;
}
//别忘了把它变成合法的颜色
result=“#”+结果;
返回结果;
但是,最好的办法是完全避免使用字符串。改用int-它们包含相同的数据,性能更好。为方便起见,在调试器中,您可以将int更改为以十六进制显示,而不是以DEC显示(在Android Studio中:在变量视图中右键单击,以->十六进制查看).原始问题您的代码在使用颜色格式时出错。
替换hslToColor()
的最后一行,如下所示,您将使其运行时不会出现错误:
public static String hslToColor(int alpha, float hue, float saturation, float lightness) {
...
// !!! ERROR WAS ON THE LAST LINE:
return String.format("#%08x", resultColorInt).toUpperCase();
}
我对它进行了测试-它可以工作,因为它还做了两件事:
1) 将值格式化为8位数
2) 添加“#”前缀
代码中可能存在的第二个问题
alpha值的值可能介于0(透明)到255(不透明)之间。如果要使用不透明图像,应传递255(0xFF)。
现在你通过了1
,我认为这是一个错误-因为它几乎是透明的。
所以要用不透明的颜色代替线条
String baseColor = hslToColor(1 ,baseColorHSL[0] , baseColorHSL[1] , (float)0.5);
与
附件
如果一个人需要得到一套颜色,那么应该运用一点创造力。
要创建色调调色板,您必须在循环中更改a)饱和度或b)亮度或c)两者。
下面是一个实现示例,它根据亮度从0.4更改为0.6(不包括在内),分10步返回调色板。
“实验性”意味着你应该为自己找到价值观。
public static ArrayList<String> returnMaterialDesignColorSet(String baseColorHex, int colorCount) {
ArrayList<String> resultList = new ArrayList<String>();
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;
}
公共静态ArrayList returnMaterialDesignColorSet(字符串baseColorHex,int colorCount){
ArrayList resultList=新建ArrayList();
float[]baseColorHSL=colorToHsl(baseColorHex);
float lght=0.4;//初始亮度值(实验)
float lStep=(0.6-lght)/colorCount;//提高到0.6亮度的步骤(实验)
对于(int i=0;i
您知道返回的值有什么问题吗?我怀疑您在十六进制、字符串、int和浮点值之间进行了更改,一些转换出现了错误。我会坚持对单个RGBA值进行调整,然后转换回存储为int的十六进制格式(例如,int color=toHex(新颜色(1f、1f、1f、1f));
)。你的意思是在更改色调或亮度时,首先生成不同的RGBA值集吗?我只会坚持使用RGBA来获得效果。但是,原理是一样的。错误可能来自生成颜色时提供的格式不正确或超出转换范围的值。你能显示颜色的轨迹吗如果要识别错误来源的行,我怀疑它将是一行类似int resultcolorit=Color.HSVToColor(alpha,newfloat[]{h,s,v});
。如果您将每个值输出到控制台Log.d(“hue”,float.toString(h))
,我怀疑您会看到不正确的值。请尝试生成十六进制字符串#ff1212..由于奇数代表重大变化,您可以减少该渐变外观的偶数。因此,如果ff0000最红色,则fd0000将接近最红色。只需减少偶数,直到它们为零,然后减少主要数字。感谢您分享这些太棒了。是你自己做的还是在什么地方找到的?干得好,孩子!你的国家以你为荣!和ori一起真是太棒了
String baseColor = hslToColor(0xFF ,baseColorHSL[0] , baseColorHSL[1] , (float)0.5);
public static ArrayList<String> returnMaterialDesignColorSet(String baseColorHex, int colorCount) {
ArrayList<String> resultList = new ArrayList<String>();
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;
}