我使用此代码将RGB转换为十六进制颜色。我有3个Edittext来输入R,G和B.现在我要做的是在不使用API的情况下进行转换。就像使用我自己的代码而不是通过toHexString()转换和计算它一样。有人可以帮助我这样做吗?非常感谢。这是我的代码。
convert.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
final int r = Integer.parseInt(showRed.getText().toString());
final int g = Integer.parseInt(showGreen.getText().toString());
final int b = Integer.parseInt(showBlue.getText().toString());
final StringBuilder builder = new StringBuilder();
builder.append("#");
builder.append(Integer.toHexString(r)); // Real computation here
builder.append(Integer.toHexString(g)); // Real computation here
builder.append(Integer.toHexString(b)); // Real computation here
result.setText(builder.toString());
}
});
答案 0 :(得分:4)
假设[0,255]范围内的r
,g
和b
值:
String hexColor = String.format( "#%02x%02x%02x", r, g, b );
阅读java.util.Formatter javadoc以获取更多格式选项。
答案 1 :(得分:2)
所以你想在没有toHexString的情况下出于某种原因......
您正在寻找的是一种将基数为10的数字转换为基数为16的方法。你想自己编码,但实际上并不是自己编码,因为你在这里。正确?
将数字除以16.如果大于9,则将余数转换为十六进制;
if(number > 9) {
switch(number) {
case 10: string remainderPlaceholder = "A";
break;
case 11: string remainderPlaceholder = "B";
break;
Etcetera,你明白了。
然后从第一部分取你的商,如果大于16,再将它除以16,取余数并使用上面提到的selfsame switch语句再次将其转换为十六进制。
滚动,冲洗并重复,将每个新答案附加到字符串的前面,直到您获得完整的值。
示例:255/16 = 15r15 15(使用上述开关转换为十六进制)=“F”; 再一次。
现在再举一个例子,编号为146:
146/16 = 9r2
转换为十六进制:92。
如果你真的想让我为你写出代码,请告诉我。但是如果你这样做,你也可以使用toHexString(),因为它比我为你写的任何东西都更有效率,因为你不会自己编写代码......
编辑:一些伪代码,以便您可以弄清楚如何编码:
int redMain = r/16;
int redRemainder = r%16;
//(do the same thing for green and blue)
int redFirst = redMain/16;
然后将上面的case语句放入一个函数中,并在连续两行中调用它,如
public void makeHex(number) {
if(number > 9) {
switch(number) {
case 10: string remainderPlaceholder = "A";
break;
case 11: string remainderPlaceholder = "B";
break;
//etcetera
你会这样称呼 makeHex(redMain);
然后你必须以正确的顺序附加字符串,所以它看起来像;
String redValue = makeHex(redMain).toString();
redValue = redValue + makeHex(redMain).toString();
然后将它们与
之类的标签一起放在一起String finalHex = "#" + redValue + greenValue + blueValue;
不太难。
但是我会认真地使用toHexString,因为这种做法可能会出现一些问题。