2013-04-03 67 views
2

我試圖將Android中的複雜路徑分解成其子輪廓。 目前,我想出了這個代碼:分解輪廓的路徑

public static ArrayList<Path> splitToContours(Path path) { 
ArrayList<Path> list = new ArrayList<Path>(); 
PathMeasure pm = new PathMeasure(path, true); 
float segment = 0; 
Path tempPath; 
do { 
    tempPath = new Path(); 
    tempPath.rewind(); 
    pm.getSegment(segment, segment + pm.getLength(), tempPath, true); 
    segment += pm.getLength(); 
    tempPath.close(); 
    list.add(tempPath); 
} while (pm.nextContour()); 
return list; 
} 

但是在我看來,在輪廓的最後一點也開始下一個輪廓。 任何人都可以幫我嗎?也許有一個更簡單,更優雅的方式來做到這一點?在過去的兩週裏,我一直把頭靠在牆上,我有點迷失在這裏。

+0

感謝這個例子,它幫助我找到了解決方案。我發現在pm.getSegment()中,前兩個參數是相對於當前輪廓而不是絕對偏移。所以你不需要'segment'變量,只需調用'pm.getSegment(0,pm.getLength(),tempPath,true)'。 – pinch

回答

2

不知道你確切的問題是什麼,但我使用這樣的東西來創建一個繪畫風格的動畫。你似乎走在正確的軌道上,也許不關閉路徑?

List<Path> segmentPath(Path path, float segmentLength, float scale, 
      float dx, float dy) { 
     PathMeasure pm = new PathMeasure(path, false); 
     float length = pm.getLength(); 

     float start = 0; 
     float delta = segmentLength; 

     List<Path> segments = new ArrayList<Path>(); 
     while (start <= length) { 
      float end = start + delta; 
      if (end > length) { 
       end = length; 
      } 

      Path segment = new Path(); 
      pm.getSegment(start, end, segment, true); 

      segments.add(segment); 
      start += delta; 
     } 

     return segments; 
    }