2014-04-01 70 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(); 
    } 
} 

的主要問題是,我不知道該線段的大小,所以我不知道如何大小COORDS陣列。我還沒有弄清楚我將如何將這些片段添加到新路徑中。似乎可以使用Path2D中的append方法,儘管它似乎將整個路徑添加到自身。

我意識到Path2D是一個形狀,但我似乎無法找到任何替代方法來做到這一點。

+0

我剛剛發現[此頁](http://www.java2s.com/Code/JavaAPI/java.awt.geom/PathIteratorcurrentSegmentdoublecoords.htm),其中包含一個非常有用的示例。 我剛剛意識到我是愚蠢的,讀錯了api。座標數組只能是座標的最大尺寸[6]。 調用repaint現在不會做任何事情,所以我想我將不得不使用助手線程來更新後臺中的路徑。 – Noupoi

+0

爲了更快提供更好的幫助,請發佈[MCVE](http://stackoverflow.com/help/mcve)(最小完整和可驗證示例)。 –

回答

0

我剛剛發現this page包含一個非常有用的例子。

原來我讀的是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(); 
     } 

過程方法更新在畫布上的路徑和調用重繪();