- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的任务是绘制随机宽度和随机粗细的水平线。当我运行程序时,厚度会发生变化。我不明白这是怎么可能的,因为我设置宽度然后画线。我不更新,所以据我所知,我不会重新划线。程序中唯一的其他代码是 init(),因为我们必须在小程序中执行此操作。
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.red);
int increment = 70; // space between lines
int linesNum = 5; // number of lines were drawing
Random rand = new Random();
int randW;
Line2D.Float[] lines = new Line2D.Float[linesNum];
for (int y = 0; y < linesNum; y++) {
// where we are at on they axis
int yoffset = (increment * y) + increment;
// random width of line max 499 min 50
randW = rand.nextInt((499 - 5) + 1) + 5;
// random thick line
g2.setStroke(new BasicStroke(rand.nextInt((increment - 10) + 1) + 5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
lines[y] = new Line2D.Float(1, yoffset, randW, yoffset);
g2.draw(lines[y]);
}
}
}
最佳答案
每次重新绘制小程序时(这可能是由于窗口移动、最小化和恢复或被另一个窗口遮挡然后显示而发生),paint
方法将再次调用,从而创建一个 new Random()
并以新的随机粗细重新绘制线条。如果您不希望这种情况发生,可以采取几种方法。
您可以使用createImage
方法创建一个缓冲区来绘制线条。使用其 getGraphics
方法获取 Graphics
对象,绘制线条,然后在您的 paint
方法中,使用传递到 paint
的 Graphics
对象的 drawImage
方法在屏幕上绘制此缓冲区。将离屏缓冲区声明为小程序类的一个字段。由于您只会在缓冲区上绘制一次,因此您的小程序被重绘多少次并不重要。
在paint
方法中有两个地方可以调用rand.nextInt
;您可以创建两个 linesNum
大小的 int[]
数组,将它们声明为小程序的字段,并使用 Random
对象将它们填充到您的 init
方法中。然后,在您的 Paint 方法中,只需重复使用之前存储在这些数组中的随机数,而不是生成随机数。这样,无论您的小程序被重新绘制多少次,您都会得到相同的结果。
在您的 paint
方法中,您创建一个 new Random()
对象。您可以通过调用以种子作为参数的构造函数或调用其 setSeed
方法来为随机数生成器 (RNG) 提供种子。如果您使用相同的种子,您将始终获得相同的伪随机数序列。如果您希望小程序的每次运行都具有不同的随机线宽(但不希望它们在每次重绘时更改),您可以创建一个 Random
对象,并使用其 nextLong
方法在小程序启动时选择随机种子,将该种子存储在小程序类的字段中,然后使用它在您的 paint
方法中为 RNG 提供种子。这样,每次调用 paint
时,您都会获得相同的随机数序列。
关于java - 为什么我的笔触粗细会改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28796355/
我想实现以下目标: 在 Canvas 上绘制背景图像(一次或如果需要重复) 图片不应该在开头可见 当我在 Canvas 上“绘制”形状时,bg-image 应该在绘制形状的位置可见 将显示的图像部分应
我是一名优秀的程序员,十分优秀!