Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以编程方式生成材质设计颜色集的方法有哪些?_Java_Android_Colors_Material Design - Fatal编程技术网

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;
}