2

我正在创建一个程序,让用户可以在屏幕上绘图,就像在 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 是一个形状,但我似乎找不到任何替代方法。

4

2 回答 2

2

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

参见此处的移动点示例 http://java-sl.com/tip_flatteningpathiterator_moving_shape.html

于 2014-04-01T11:46:30.400 回答
1

我刚刚发现这个页面包含一个非常有用的示例。

原来我读错了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();

于 2014-04-01T19:37:36.857 回答