如何在Java中从选定的一组颜色中输出随机颜色?(Android)

5

我希望当用户输入答案时,字符串能够随机获得一个颜色。我的问题是,我不知道如何使字符串的随机颜色在特定范围内。例如,如果我想让字符串随机变成蓝色、红色、绿色、粉色、白色或棕色。只有这些颜色,没有其他颜色。

到目前为止,我已经使用以下代码成功地获得了所有可能的RBG变化中的完全随机颜色:

Random rand = new Random();
            int r = rand.nextInt(254)+1;
            int g = rand.nextInt(254)+1;
            int b = rand.nextInt(254)+1;

            int randomColor = Color.rgb(r,g,b);
            word.setTextColor(randomColor);

虽然之前已经提到过,但这不是我的目的。相反,我想设置颜色,可以将其随机应用于字符串。这些是我选择的颜色,然后将其随机设置为字符串颜色。这将设置一个完全随机的颜色,而我并不打算使用一定范围内的颜色。例如,我可能会得到5种不同的蓝色变化。
如果有人能提出解决方案,我将不胜感激。谢谢。

请查看此链接:https://dev59.com/GF8e5IYBdhLWcg3wRIpQ#25923418。 - Akash Patel
@AkashPatel 谢谢,解决了问题。 - H3ll0
@H3II0 欢迎.. :) - Akash Patel
@AkashPatel,您是否愿意将其发布为答案,以便我将其标记为已解决? - H3ll0
4个回答

6
首先,在< strong>color.xml 中定义您的颜色并创建其数组。
<?xml version="1.0" encoding="utf-8"?>
<resources>

<item name="blue" type="color">#FF33B5E5</item>
<item name="purple" type="color">#FFAA66CC</item>
<item name="green" type="color">#FF99CC00</item>
<item name="orange" type="color">#FFFFBB33</item>
<item name="red" type="color">#FFFF4444</item>
<item name="darkblue" type="color">#FF0099CC</item>
<item name="darkpurple" type="color">#FF9933CC</item>
<item name="darkgreen" type="color">#FF669900</item>
<item name="darkorange" type="color">#FFFF8800</item>
<item name="darkred" type="color">#FFCC0000</item>

<integer-array name="androidcolors">
    <item>@color/blue</item>
    <item>@color/purple</item>
    <item>@color/green</item>
    <item>@color/orange</item>
    <item>@color/red</item>
    <item>@color/darkblue</item>
    <item>@color/darkpurple</item>
    <item>@color/darkgreen</item>
    <item>@color/darkorange</item>
    <item>@color/darkred</item>
</integer-array>

</resources>

现在在onCreate方法中生成随机颜色,如下所示。
int[] androidColors = getResources().getIntArray(R.array.androidcolors);
int randomAndroidColor = androidColors[new Random().nextInt(androidColors.length)];

最后设置生成的颜色。
view.setBackgroundColor(randomAndroidColor);  

以下内容源自此处


1
使用颜色选择器工具来了解RGB值的工作原理。例如,如果将R设置为255,然后将G和B设置为相同的数字,您将得到一些红色的阴影。绿色和蓝色也是如此。但是,如果保持其他两个值相同,并仅更改剩余值,则会再次返回某种较浅或较深的红色、绿色或蓝色版本(取决于该剩余值是否为R、G或B)。对于每种颜色,这种快捷方式都可以很好地工作。因此,例如,找到一个紫色。然后,您将必须将两个RGB值相同地更改以获得外观不同的紫色。
例如: R=255,G=65,B=255是紫色。 R=190,G=65,B=190也是紫色。 R=190,6=95,B=190也是紫色。
但是,有一个范围。我的意思是,值并不总是0-255。要找到该范围,您可以尝试几个值,以确定最小值和最大值是什么。
请注意,这只是一种快捷方式,但我认为它足够有用。

编辑:为了得到更好的解决方案,尝试学习十六进制颜色的工作原理。然后您可以为某些颜色类型定义范围。从这里开始: http://blog.digitaltutors.com/understanding-hexadecimal-colors-simple/


1
一个简单的方法是定义一个颜色列表。然后使用随机函数来选择其中一种颜色进行操作。 创建所需颜色列表 这不是一个详尽的列表,但包括了四种颜色:红色、蓝色、绿色和粉色。
List<Integer> colors = new ArrayList<>();
colors.add(Color.rgb(235,22,220));
colors.add(Color.BLUE);
colors.add(Color.GREEN);
colors.add(Color.RED);

创建一个简单的方法来返回随机颜色。
现在我们只需要一个方法从列表中返回一个随机颜色。它仅有两行代码。
private int randomColor(){
    Random rand = new Random();
    return colors.get(rand.nextInt(colors.size()));
}

改变TextView颜色

现在我们只需要改变颜色。下面是一个在按钮的onClick监听器中的示例。你也可以在这里添加一些验证,以确保不会出现重复的颜色,比如连续两次使用蓝色。

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        int color = randomColor();
        if(txtView.getCurrentTextColor() != color){
             txtView.setTextColor(color);
        }else{
             txtView.setTextColor(randomColor());
        }
    }
});

易于编写,简洁快速。

在Android Studio中,数组中没有".add"选项。我该如何集成它? - H3ll0
1
.add是LIST类的一个方法。为了使用.add,您需要使用一个列表。您正在使用什么数据结构?我的例子是一个列表。 - basic

1

侧记:

rand.nextInt(254)+1; 

生成一个介于1和255之间的数字,但颜色范围在0到255之间。
rand.nextInt(256); 

我会尽力帮助您进行翻译。以下是需要翻译的内容:

应该真正包括所有可能性。

现在回答你的问题

如果您只想在一定数量的颜色之间变化,不要随机选择所有1600万种可能性,而是预定义一组漂亮的颜色。

您可以创建一个包含预定义颜色的数组,然后随机选择一个,或者生成颜色但限制结果:

    int r = 0;
    int g = 0;
    int b = 0;
    switch(rand.nextInt(8)){    // switch over 8 possible colors
        case (0):   // red
            r = 205;
            break;
        case (1):   // green
            g = 205;
            break;
        case (2):   // blue
            b = 205;
            break;
        case (3):   // pink
            r = 255;
            g = 20;
            b = 147;
            break;
        case (4):   // yellow
            r = 200;
            g = 200;
            break;
        case (5):   // magenta
            r = 200;
            b = 200;
            break;
        case (6):   // orange
            r = 255;
            g = 165;
            break;
        case (7):   // purple
            r = 128;
            b = 128;
            break;
    }

当然,这是一个“大型”解决方案,但可以避免创建一个驻留在您内存中的数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接