【问题标题】:How to output a random color from a set of selected colors in Java? (Android)如何从 Java 中的一组选定颜色中输出随机颜色? (安卓)
【发布时间】:2017-03-10 03:34:58
【问题描述】:

所以我希望在用户输入答案时给字符串随机颜色。我的问题是我不确定如何使字符串的随机颜色成为特定范围的颜色。例如,如果我希望字符串随机变为蓝色、红色、绿色、粉红色、白色或棕色。只有这些颜色,没有其他。

到目前为止,我已经使用以下代码从所有可能的 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 种蓝色。

如果有人能提出解决方案,我将不胜感激。谢谢。

【问题讨论】:

  • 检查this
  • @AkashPatel 谢谢,做到了。
  • @H3II0 欢迎.. :)
  • @AkashPatel 您想将其发布为我的答案以将其标记为已解决吗?

标签: java android random colors


【解决方案1】:

首先在 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);  

来源取自here

【讨论】:

    【解决方案2】:

    一个简单的方法是定义一个颜色列表。然后使用随机来选择您的动作中的一种颜色。

    创建所需颜色列表

    这不是一个广泛的列表,但包括 4 种颜色开始,红色、蓝色、绿色和粉红色。

    List<Integer> colors = new ArrayList<>();
    colors.add(Color.rgb(235,22,220));
    colors.add(Color.BLUE);
    colors.add(Color.GREEN);
    colors.add(Color.RED);
    

    创建一个返回随机颜色的简单方法

    现在我们只需要一个从列表中返回随机颜色的方法。它长达 2 行。

    private int randomColor(){
        Random rand = new Random();
        return colors.get(rand.nextInt(colors.size()));
    }
    

    更改文本视图颜色

    现在我们可以改变颜色了。下面的示例是在一个按钮 onClickListener 中。您还可以在此处添加一些验证,以确保您不会得到重复的颜色,例如连续两次蓝色。

    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”选项。我将如何整合它?
    • .add 是 LIST 类的一个方法。为了使用 .add 你需要使用一个列表。你用的是什么数据结构?我的例子是一个列表
    【解决方案3】:

    旁注:

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

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

    【讨论】:

      【解决方案4】:

      使用颜色选择器工具了解 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/

      【讨论】:

        猜你喜欢
        • 2014-12-26
        • 1970-01-01
        • 2012-08-24
        • 2015-04-09
        • 1970-01-01
        • 2013-02-03
        • 2015-08-16
        • 1970-01-01
        相关资源
        最近更新 更多