动画Path2D的绘图

时间:2014-04-01 11:35:15

标签: java swing drawing path-2d

我正在创建一个允许用户在屏幕上绘图的程序,就像在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();
    }
}

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

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

2 个答案:

答案 0 :(得分:1)

您可以使用FlatteningPathIterator来设置您的Shape和处理细分。

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

答案 1 :(得分:0)

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

原来我正在读api错误。坐标数组的最大大小为7。

为了实现这一点,我还必须使用SwingWorker在后台更新Path。 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();