2014-04-01 5 views
1

저는 MS 페인트에서 연필 도구를 사용하는 것과 같이 사용자가 화면에 그림을 그릴 수있게하는 프로그램을 만들고, 누군가가 마치 그림을 그리는 과정을 재연하도록 허용하고 있습니다. 그것을 당신 앞에서 그리세요.Path2D의 그림 애니메이션하기

Path2D를 사용하여이 작업을 수행 한 방법과 moveTo 및 lineTo 메서드를 사용하여 경로를 사용하여 선을 그립니다.

이제 Path2D 객체의 다시 그리기에 애니메이션을 적용하는 방법을 알아낼 수 없습니다. 현재의 전략은 새로운 Path2D를 만들고 PathIterator를 사용하여 이전 경로의 선분을 새 경로에 반복적으로 추가하는 것입니다. 내가 지금까지 생각하고 무엇을

은 다음과 같습니다

public void redrawPath() { 
    Path2D oldPath = path; 
    path = new Path2D.Double(); 
    double[] coords = new double[100]; 

    PathIterator pi = oldPath.getPathIterator(new AffineTransform()); 

    while (!pi.isDone()) { 
     pi.next(); 
     pi.currentSegment(coords); 
     //Add segment to new path 

     repaint(); 
    } 
} 

주요 문제는 내가 선 세그먼트의 크기를 모르는, 그래서 나도 몰라 어떻게 크기 좌표 배열에 . 세그먼트를 새 경로에 추가하는 방법을 알지 못했습니다. Path2D의 append 메소드를 사용할 수는 있지만 전체 경로를 추가하는 것처럼 보일 수 있습니다.

Path2D가 Shape이라는 것을 알고 있지만,이 작업을 수행하는 다른 방법을 찾을 수 없습니다.

+0

매우 유용한 예제가 포함 된 [이 페이지] (http://www.java2s.com/Code/JavaAPI/java.awt.geom/PathIteratorcurrentSegmentdoublecoords.htm)를 방금 발견했습니다. 방금 ​​내가 벙어리가되고 api를 잘못 읽음을 깨달았습니다. 좌표 배열은 최대 크기의 좌표로만 사용할 수 있습니다 [6]. 이제 repaint을 호출해도 아무런 변화가 없으므로 헬퍼 스레드를 사용하여 백그라운드에서 경로를 업데이트해야합니다. – Noupoi

+0

더 나은 도움을 받으려면 [MCVE] (http://stackoverflow.com/help/mcve) (최소 완료 및 검증 가능 예제)를 게시하십시오. –

답변

0

로 참조하십시오.

밝혀졌습니다. 나는 API를 잘못 읽고있었습니다. 좌표 배열은 최대 크기가 7이 될 수 있습니다.

이 작업을하려면 SwingWorker를 사용하여 백그라운드에서 경로를 업데이트해야했습니다. redrawPath()는 스레드를 시작하기 만합니다.

는 같은 SwingWorker의의 doInBackGround의 코드가 모습입니다 : 프로세스 방법은 캔버스에 경로를 업데이트하고 통화를 다시 칠

PathIterator pi = oldPath.getPathIterator(null); 
while (!pi.isDone()) { 
      double[] coordinates = new double[6]; 
      int type = pi.currentSegment(coordinates); 

      switch (type) { //Decide what do based on type of segment 
       case PathIterator.SEG_MOVETO: 
        tempPath.moveTo(coordinates[0], coordinates[1]); 
        break; 
       case PathIterator.SEG_LINETO: 
        tempPath.lineTo(coordinates[0], coordinates[1]); 
        break; 
       default: 
        break; 
      } 

      publish(tempPath.clone()); 

      pi.next(); 
     } 

();