2013-08-06 2 views
0

저는 캔버스로 그 느낌을 얻기 위해 놀고 있습니다. 그래서 나는 캔버스에 그려 넣으려는 점의 배열을 만들었습니다. 그러나 캔버스에 마지막 점만 표시됩니다 ... 캔버스에 배열의 모든 점을 표시하는 방법을 잘 모르겠지만 어떤 도움을 주시면 감사하겠습니다!안드로이드 : 반복 중에 캔버스에 그리기

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

} 

답변

1

나는 당신의 문제가 당신의 세트 루프에 생각 :

자바에서
for(int i = 0; i <= 30; i++) 
{ 
    point1.set(i, i); 
    pointList.add(i, 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 변수가 필요하지 않습니다.

또한 포인트가 매우 가깝습니다. 이러한 변경 사항이 있더라도 차이점을 볼 수 없습니다. 당신은 당신의 점수를 약간 줄이기를 원할지도 모른다.

+0

완벽하게 작동합니다. MJD에 감사드립니다! – user2655110

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

} 
+0

완벽하게 작동합니다. 많은 개구쟁이 들께 감사드립니다! – user2655110