【问题标题】:Animate the drawing of Path2D动画 Path2D 的绘图
【发布时间】:2014-05-12 03:45:37
【问题描述】:

我正在创建一个程序,让用户可以在屏幕上绘图,就像使用 MS 绘图中的铅笔工具一样,然后允许用户重播创建绘图的过程,就好像有人在前面画一样你。

我使用 Path2D 完成此操作的方式,并通过 moveTo 和 lineTo 方法,使用路径绘制一条线。

我现在似乎无法弄清楚如何为 Path2D 对象的重绘设置动画。我目前的策略是创建一个新的 Path2D,并使用 PathIterator 迭代地将线段从旧路径添加到新路径。

这是我目前的想法:

public void redrawPath() {
    Path2D oldPath = path;
    path = new Path2D.Double();
    double[] coords = new double[100];

    PathIterator pi = oldPath.getPathIterator(new AffineTransform());

    while (!pi.isDone()) {
        pi.next();
        pi.currentSegment(coords);
        //Add segment to new path

        repaint();
    }
}

主要问题是我不知道线段的大小,所以我不知道如何调整坐标数组的大小。我还没有完全弄清楚如何将这些段添加到新路径中。似乎可以使用 Path2D 中的 append 方法,尽管它似乎将整个路径添加到自身。

我意识到 Path2D 是一个 Shape,但我似乎找不到任何替代方法。

【问题讨论】:

  • 我刚刚发现this page 包含一个非常有用的示例。我刚刚意识到我很愚蠢并且读错了api。坐标数组只能是 coords[6] 的最大大小。现在调用 repaint 没有任何作用,所以我想我将不得不使用辅助线程来更新后台的路径。
  • 若想尽快获得更好的帮助,请发布MCVE(最小完整且可验证的示例)。

标签: java swing drawing path-2d


【解决方案1】:

您可以使用 FlatteningPathIterator 粘贴您的 Shape 和处理段。

在此处查看移动点示例 http://java-sl.com/tip_flatteningpathiterator_moving_shape.html

【讨论】:

    【解决方案2】:

    我刚刚发现 this page 包含一个非常有用的示例。

    原来我读错了 api。坐标数组的最大尺寸只能是 7。

    为了让它工作,我还必须使用 SwingWorker 在后台更新路径。 redrawPath() 只是启动线程。

    SwingWorker 的 doInBackGround 中的代码如下所示:

    PathIterator pi = oldPath.getPathIterator(null);
    while (!pi.isDone()) {
                double[] coordinates = new double[6];
                int type = pi.currentSegment(coordinates);
    
                switch (type) { //Decide what do based on type of segment
                    case PathIterator.SEG_MOVETO:
                        tempPath.moveTo(coordinates[0], coordinates[1]);
                        break;
                    case PathIterator.SEG_LINETO:
                        tempPath.lineTo(coordinates[0], coordinates[1]);
                        break;
                    default:
                        break;
                }
    
                publish(tempPath.clone());
    
                pi.next();
            }
    

    process方法更新画布上的路径并调用repaint();

    【讨论】:

      猜你喜欢
      • 2021-11-05
      • 2020-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多