我正在玩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);
}
答案 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);
}