我正在创建一个程序,允许用户在屏幕上绘图,就像在MS paint中使用铅笔工具一样,然后允许用户重播创建绘图的过程,就好像有人在你面前画它一样。
我使用 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 中的追加方法,尽管它似乎将整个路径添加到自身。
我意识到Path2D是一个形状,但我似乎找不到任何替代方法来做到这一点。
您可以使用 FlatteningPathIterator 来调整形状和处理段。
请参阅此处的示例移动点http://java-sl.com/tip_flatteningpathiterator_moving_shape.html
我刚刚发现这个页面包含一个非常有用的示例。
事实证明我读错了 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();
}
进程方法更新画布上的路径并调用 repaint();