2012-08-01 151 views
1

在我的應用程序中,我必須合併幾條短路徑才能創建一條較大的路徑。例如:Android路徑:合併幾條路徑並在合併路徑上繪製文本

Path p1 = new Path(); 
Path p2 = new Path(); 
p1.moveTo(0,0); p1.lineTo(200,200); 
p2.moveTo(200,200); p2.lineTo(400,0); 

p1.addPath(p2); //merge 

Paint paint = new Paint(); 
paint.setStyle(Paint.Style.STROKE); 
paint.setColor(Color.BLACK); 

canvas.drawColor(Color.WHITE); 
canvas.drawPath(p1, paint); 

這工作得很好,並繪製一個整潔的V形的畫布。

但是,如果我想使用合併路徑進行文本渲染(使用Canvas.drawTextOnPath()),它只沿着路徑的第一部分(即原始的p1)繪製文本。不過,我想使用整個路徑進行文本渲染。那麼有沒有辦法實現這一點?

回答

1

我自己想到了......所描述的行爲似乎是known issue。我想這是因爲每條路徑都被看作是一個獨立的「輪廓」,而這個輪廓不能與另一條路徑合併。

但是我能夠通過簡單的「黑客」獲得所需的行爲。但這隻適用於基於行的路徑。下面的代碼(小例子),只是如果任何人的興趣......

public class MyPath extends Path { 

    private ArrayList<Float> points = new ArrayList<Float>(); 

    public void addPath(MyPath src) { 
     this.points.addAll(src.getPoints()); 
     super.rewind(); 
     super.moveTo(this.points.get(0), this.points.get(1)); 
     for (int i = 2; i < this.points.size(); i += 2) { 
      super.lineTo(this.points.get(i), this.points.get(i+1)); 
     } 
    } 

    @Override 
    public void moveTo(float x, float y) { 
     this.points.add(x); 
     this.points.add(y); 
     super.moveTo(x, y); 
    } 

    @Override 
    public void lineTo(float x, float y) { 
     this.points.add(x); 
     this.points.add(y); 
     super.lineTo(x, y); 
    } 

    public ArrayList<Float> getPoints() { 
     return this.points; 
    } 

} 

的這種用法很簡單:

MyPath p1 = new MyPath(); 
MyPath p2 = new MyPath(); 
p1.moveTo(0,0); p1.lineTo(200,200); 
p2.moveTo(200,200); p2.lineTo(400,0); 

p1.addPath(p2); //merge 

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
paint.setColor(Color.BLACK); 
paint.setTextSize(40); 

canvas.drawColor(Color.WHITE); 
canvas.drawTextOnPath("Lorem ipsum dolor sit amet", p1, 0, 0, paint); 
0

您是否必須使用兩條路徑?您可以嘗試使用一個像:

Path p1 = new Path(); 
p1.moveTo(0,0); p1.lineTo(200,200); 
p1.lineTo(400,0); 

,然後使用該Canvas.drawTextOnPath()p1

希望有所幫助。

+0

我已經想到了這一點,但我不得不重寫我的應用程序的整個邏輯,以便只使用一個路徑。那麼,如果沒有人有解決方案的幾個路徑,我將不得不咬住子彈......;) – Aletheios 2012-08-02 01:10:20

+0

我明白了。也許這可以幫助:http://www.java2s.com/Code/Android/2D-Graphics/Drawtextalongwithpath.htm – 0gravity 2012-08-02 01:15:22

0

Path.addPath()似乎仍然是工作正在進行中。您可以避免使用它,但不要通過將多個分段直接附加到要繪製的Path來擴展Path

public void insertPart1(Path path) { 
    p1.moveTo(0,0); p1.lineTo(200,200); 
} 
public void insertPart2(Path path) { 
    p2.lineTo(200,200); p2.lineTo(400,0); 
} 

{ 
    Path p = new Path(); 
    insertPart1(p); 
    insertPart2(p); 

    Paint paint = new Paint(); 
    paint.setStyle(Paint.Style.STROKE); 
    paint.setColor(Color.BLACK); 

    canvas.drawColor(Color.WHITE); 
    canvas.drawPath(p1, paint); 
} 
+0

感謝您的建議,但這並不能解決我的問題;這只是@ 0gravity答案的更詳細版本。你假設只有一個Path實例,但是在我的算法中,我有幾個實例(較大路徑的段)必須隨後合併。 – Aletheios 2013-04-18 15:28:23