0

我正在使用 Canvas 来感受它的感觉,所以我创建了一系列点,然后我尝试将它们绘制到 Canvas 上。但是,只有最后一个点显示在画布上......我不确定如何在画布上显示数组中的所有点,但任何帮助将不胜感激!

List<Point> pointList = new ArrayList<Point>();
Point point1 = new Point();
point1.set(0,0);

Point point2 = new Point();
point2.set(0,0);

Paint red = new Paint();
red.setColor(Color.RED);

for(int i = 0; i <= 30; i++)
{
point1.set(i, i);
pointList.add(i, point1);

}

for(int i = 0; i <= 30; i++)
{
point2 = pointList.get( i );        
canvas.drawPoint(point2.x, point2.y, red);

}
4

2 回答 2

1

我相信您的问题出在您的设置循环中:

for(int i = 0; i <= 30; i++)
{
  point1.set(i, i);
  pointList.add(i, point1);
}

在java中,所有包含对象的变量实际上都是指针。因此 point1 总是指向同一个对象,因为你永远不会改变它所指向的东西。在每次循环迭代中,您更改指向的对象,并将其重新插入到列表中。因此,pointList 包含同一点的 31 个实例,均位于 (30, 30)。

相反,您应该在每次迭代中创建一个新点,因此您的代码如下所示:

for(int i = 0; i <= 30; i++)
{
  Point p = new Point();
  p.set(i, i);
  pointList.add(i, p);
}

然后它将在循环的每次迭代中创建一个新点。您也不再需要 point1 变量。

此外,您的观点非常接近。即使进行了这些更改,您也可能看不到差异。你可能想把你的观点分开一些。

于 2013-08-06T02:44:46.057 回答
0

我相信这是因为 ArrayList add() 正在添加对对象的引用,而不是对象本身的副本。尝试:

List<Point> pointList = new ArrayList<Point>();
Point point1 = new Point();
point1.set(0,0);

Point point2 = new Point();
point2.set(0,0);

Paint red = new Paint();
red.setColor(Color.RED);

for(int i = 0; i <= 30; i++)
{
    Point point3 = new Point();
    point3.set(i, i);
    pointList.add(i, point3);

}

for(int i = 0; i <= 30; i++)
{
    point2 = pointList.get( i );        
    canvas.drawPoint(point2.x, point2.y, red);

}
于 2013-08-06T02:44:52.157 回答