Android路径:合并多个路径并在合并路径上绘制文本

时间:2012-08-01 20:32:09

标签: android text path merge

在我的应用程序中,我必须合并几个短路径来创建一个更大的路径。例如:

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)绘制文本。不过,我想使用整个路径进行文本渲染。那么有没有办法实现这一目标?

3 个答案:

答案 0 :(得分:2)

自己想出来......描述的行为似乎是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);

答案 1 :(得分:0)

你必须使用两条路径吗?您可以尝试使用以下内容:

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

然后使用Canvas.drawTextOnPath()

上的p1

希望有所帮助。

答案 2 :(得分: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);
}