安卓路径 : Merge several paths and draw text on merged path

标签 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);

这工作得很好,在 Canvas 上绘制了一个整洁的 V 形。

但是,如果我想使用合并路径进行文本渲染(使用 Canvas.drawTextOnPath()),它只会沿着路径的第一部分绘制文本(即原始 p1 )。不过,我想使用整个路径进行文本渲染。那么有什么办法可以实现吗?

最佳答案

我自己想出来了...所描述的行为似乎是 known issue .我猜这是因为每条路径在内部都被视为一个单独的“轮廓”,无法与另一条路径合并。

但是我能够通过简单的“hack”获得所需的行为。不过,这仅适用于基于线的路径。这是代码(最小示例),如果有人感兴趣的话......

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);

关于安卓路径 : Merge several paths and draw text on merged path,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11767124/

相关文章:

android - 从反射(reflect)在先前创建的 Activity 中的 Activity 更改语言

android - Android Gradle 中的 'resource-generating task' 是什么?

mysql - Apache - MySQL 服务检测到错误的路径。/端口已在使用中

macos - 如何在mac中显示隐藏文件?

android - 如何创建 .pwd 文件来为 Bundle Tool 签名 APK 集?

c - 为什么我的变量在 strtok() 和 fgets() 之后改变而不修改它?

arrays - 慢速 CPU 的快速索引?

javascript - Div 文本不显示

Java进程构建器: environment set correctly but still command not found

java - 增加 Firebase Firestore 中的现有值(value)