1

私のアプリケーションでは、いくつかの短いパスをマージして、より大きなパスを作成する必要があります。例:

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)に沿ってのみテキストを描画します。ただし、テキストレンダリングにはパス全体を使用したいと思います。それで、それを達成する方法はありますか?

4

3 に答える 3

2

これを自分で理解しました...説明されている動作は既知の問題のようです。これは、すべてのパスが、別のパスとマージできない個別の「輪郭」として内部的に認識されているためだと思います。

しかし、私は単純な「ハック」で目的の動作を得ることができました。ただし、これは回線ベースのパスでのみ機能します。誰かが興味を持っている場合に備えて、ここにコード(最小限の例)があります...

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);
于 2012-08-02T12:55:11.627 に答える
0

2つのパスを使用する必要がありますか?次のようなものを使用してみることができます:

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

次に、を使用しCanvas.drawTextOnPath()ますp1

お役に立てば幸いです。

于 2012-08-01T20:39:35.943 に答える
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);
}
于 2013-04-17T22:36:47.927 に答える