【问题标题】:Android Path: Merge several paths and draw text on merged pathAndroid Path:合并多个路径并在合并路径上绘制文本
【发布时间】:2012-08-01 20:32:08
【问题描述】:

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

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

【问题讨论】:

    标签: android text path merge


    【解决方案1】:

    我自己想通了...所描述的行为似乎是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);
    

    【讨论】:

      【解决方案2】:

      你必须使用两条路径吗?您可以尝试使用类似:

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

      然后在p1上使用Canvas.drawTextOnPath()

      希望对您有所帮助。

      【讨论】:

      • 我已经想到了这一点,但是我必须重写我的应用程序的整个逻辑才能只使用一个路径。好吧,如果没有人有多个路径的解决方案,我将不得不咬紧牙关...... ;)
      • 我明白了。也许这可以帮助:java2s.com/Code/Android/2D-Graphics/Drawtextalongwithpath.htm
      【解决方案3】:

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

      【讨论】:

      • 感谢您的建议,但这并不能解决我的问题;这只是@0gravity 答案的更详细版本。您假设只有一个 Path 实例,但是在我的算法中,我有几个实例(较大路径的段)必须随后合并。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 2012-08-02
      • 2013-04-12
      • 1970-01-01
      相关资源
      最近更新 更多