0

Canvas の感触をつかむために Canvas をいじっているので、Point の配列を作成し、それを 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 が指している対象を変更することはないため、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 に答える