3

好吧,我正在尝试随机生成一种颜色,但有限制。

通过使 RGB 颜色仅在 0 到 49 之间。

它应该是这样的: color.nextInt(50); 正确的?

这是绘制正方形的活动的代码:

public class Draw extends View 
{
    public Draw(Context context) 
    {
        super(context);
    }

    Paint prop = new Paint();
    Random color = new Random();

    @Override
    protected void onDraw(Canvas canvas) 
    {
        super.onDraw(canvas);

        int width = getWidth();
        int height = getHeight();

        int oriwidth = 0;
        int oriheight = 0;      

        for (int x = 0; x < 20; x++) 
        {
            int red = color.nextInt(50);
            int green = color.nextInt(50);
            int blue = color.nextInt(50);

            prop.setARGB(0, red, green, blue);
            canvas.drawRect(oriwidth += 10, oriheight += 10, width -= 10, height -= 10, prop);
        }
    }
}

结果是一个完整的白色正方形。没有限制我会很好。

你能让我正确地在一组值之间画一个正方形吗?

感谢您的帮助,对不起英语。

4

3 回答 3

2

setArgb 的第一个参数是透明度。您应该始终将其设置为 255。

于 2013-09-26T18:27:00.990 回答
0

就像我在评论中所说的那样,您需要设置 alpha 透明度才能显示。

它“无限制”工作的原因是因为您超出了0...255每个组件的范围。nextInt()没有参数从 生成一个数字0...MAX_INT-1

要了解为什么这很重要,请查看以下内容的来源Paint#setARGB()

public void setARGB(int a, int r, int g, int b) {
    setColor((a << 24) | (r << 16) | (g << 8) | b);
}

它所做的只是将值转换并组合成一个“打包” int。如果您超出每个组件一个字节的范围,则行为是“未定义的”。例如,如果您尝试将颜色定义为ARGB = 0,256,0,0,您会得到:

(a << 24) = 0
(r << 16) = 16777216
(g <<  8) = 0
(b)       = 0
(final)   = 16777216

现在,如果您将其解压缩到组件中,您就会看到问题所在。16777216 >> 24 = 1, 所以它得到了 alpha 的值,其余的都归零。如此有效,你现在有了颜色ARGB = 1,0,0,0


基本上,当您“无限制地”运行它时,您正在分配一个 alpha,但这完全是无意的。请记住将您的组件限制为最大 255,即使您明确指定了 alpha,否则您最终可能会得到意想不到的结果。

于 2013-09-26T19:19:12.117 回答
0

为什么你被限制在 50,因为最高限制是 255 。

int min = 0;
int max = 255;
int transparency=255;// from 0 to 255 ,255 means no transparency

Random r = new Random();
int red = r.nextInt(max - min + 1) + min;
int green= r.nextInt(max - min + 1) + min;
int blue= r.nextInt(max - min + 1) + min;
prop.setARGB(transparency, red, green, blue);

通过更改 min , max 您可以限制颜色组合。谢谢

于 2013-09-26T18:36:37.207 回答