Android:在循环中绘制到画布

时间:2013-08-06 02:29:59

标签: android list loops android-canvas draw

我正在玩Canvas以获得它的感觉,所以我创建了一个Point数组,然后我尝试绘制到Canvas。但是,只有最后一个Point出现在画布上...... 我不确定如何在画布上显示阵列中的所有点,但任何帮助都将不胜感激!

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

}

2 个答案:

答案 0 :(得分: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变量。

另外,你的观点非常接近。即使有这些变化,您也可能无法看到差异。你可能希望将你的观点分开。

答案 1 :(得分: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);

}