使用Random类获取随机颜色?

5

我的应用程序要求列表视图项目具有轻盈但不透明的颜色。我得到的随机颜色通常非常暗,而且我不知道在哪个范围内可以只获取浅色。随机给出的范围如下:

 Random rndm = new Random();
 int color = Color.argb(255, rndm.nextInt(256), rndm.nextInt(256), rndm.nextInt(256));
 RelativeLayout rl=(RelativeLayout)rowView.findViewById(R.id.front);
 rl.setBackgroundColor(color);

如果您已经生成了位图,则调色板应该是一个解决方案:https://developer.android.com/reference/android/support/v7/graphics/Palette.html - shkschneider
我并没有生成位图,正如你所看到的,我只是将背景颜色设置为相对布局。 - Devendra Singh
你可以……这只是一个想法。看看我的答案,试一试吧。 - shkschneider
6个回答

6

您希望使用较浅的颜色。这意味着RGB组件值必须介于128和255之间。

由于Random.nextInt(int max)返回一个int类型的值,范围从0(包括)到max(不包括),您可以尝试以下代码:

Random rnd = new Random();
int r = rnd.nextInt(128) + 128; // 128 ... 255
int g = rnd.nextInt(128) + 128; // 128 ... 255
int b = rnd.nextInt(128) + 128; // 128 ... 255

Color clr = Color.rgb(r, g, b);

1
实际上,浅色将包括在128和255之间(只是为了解释)。 - shkschneider
1
你的方法返回了我想要的结果,分别是2296164、5335561和8141674,而Bowsska的方法返回了12958379、10361308和11232046。这些结果是针对三个项目的。非常感谢。 - Devendra Singh
http://stackoverflow.com/questions/30079204/how-to-done-http-calls-in-background-using-timer - Devendra Singh
看起来你已经得到了答案。顺便说一句,每次发布问题时都关注特定用户并不是一个好主意。我没有所有的答案。特别是这个问题,我无法回答它。 - Phantômaxx
不,Devendra。直到现在,我从未涉及过POST REST、JSON等内容。对我来说,这真的是一个未知领域。 - Phantômaxx
显示剩余3条评论

4

我向你提出一个想法,现在我来解释一下:

Random random = new Random();
int color = Color.argb(255, random.nextInt(256), random.nextInt(256), random.nextInt(256));

Bitmap bitmap = new Bitmap(context);
bitmap.eraseColor(color);

Palette.from(bitmap).getLightVibrantColor();

看到了吗?我正在创建一个虚拟的Bitmap,用你随机生成的颜色填充它,然后使用Palette API获取“亮丽”的颜色。


谢谢 @shkschneider,我懂了。 - Devendra Singh
将多个数据以预定义格式发送到服务器? @shkschneider - Devendra Singh

4

通常需要三个RGB值中有一个大于128才能获得明亮的颜色,因此选择3个随机值,并检查其中一个是否大于128可能就足够了。数值越大,颜色就越亮。

您可以检查平均值是否大于128,这可以带来很好的效果。

public int getRandomColor() {

Random rndm = new Random();

int r = rndm.nextInt(256);
int g = rndm.nextInt(256);
int b = rndm.nextInt(256);
int adjust = 0;

if( (r + g + b)/3 < 128)
    int adjust = (128 - (r + g + b)/3)/3;

r += adjust;
g += adjust;
b += adjust;

return Color.argb(255, r, g, b);
}

1
Der Golem方法返回了2296164、5335561和8141674,而您返回了12958379、10361308和11232046。这些结果是针对三个项目的。@Bowsska。非常感谢。 - Devendra Singh

3
为了获得一个明亮的随机颜色,您需要让每个通道都有一些最小值。
以下是代码:
// minimumBrightnessRatio between 0 and 1. 1 = all white, 0 = any possible color. Best results would be 0.5.
public int getRandomColor(float minimumBrightnessRatio)
{
    Random rndm = new Random();

    final int minimumColorValue = (int)(255f * minimumBrightnessRatio);
    final int variableColorValue = 255 - minimumColorValue;

    final int r = minimumColorValue + rndm.nextInt(variableColorValue);
    final int g = minimumColorValue + rndm.nextInt(variableColorValue);
    final int b = minimumColorValue + rndm.nextInt(variableColorValue);

    return Color.argb(255, r, g, b);
}

先生,我想制作类似于这个应用主页的用户界面。我无法发布答案,而且我认为它不符合标准。我只是想制作这个应用的主页,包括滚动效果。请指导我,这真的很紧急。 - Devendra Singh

2

你需要限制选择的颜色空间。目前你正在使用整个RGB光谱,其中一半当然是暗色调。因此,我建议您为所有通道设置基准颜色范围(通过实验或查看您喜欢的图形程序的颜色选择器),并仅随机选择超过该基准线的范围。

final int basec = 128; //baseline would be 50% gray

Random rndm = new Random();
int color = Color.argb(255, basec + rndm.nextInt(256-basec), basec + rndm.nextInt(256-basec), basec + rndm.nextInt(256-basec));

RelativeLayout rl=(RelativeLayout)rowView.findViewById(R.id.front);
rl.setBackgroundColor(color);

2

在处理光的强度时(在您的情况下,需要浅色),HSI模型非常方便。您可以随机生成0.8到1之间的强度,然后随机化色相和饱和度。然后将其转换为RGB。


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