我正在写一个简单的绘画程序。为了模拟铅笔画,我将绘制的点存储在一个集合中,因此当调整窗口大小时,点不会消失,并且每当添加另一个点时我都会调用 repaint 方法( paint 方法在屏幕上绘制数组中的所有颜料。但是当点数增加时,程序运行缓慢。 有没有更有效的方法来做到这一点?
答案 0 :(得分:2)
获得恒速重绘的最快方法是存储绘制为位图的整个图像,当然也可以在用户绘制时更新它。这样,您可以重绘正确的内容,甚至可以根据需要添加滚动条等。例如,您可以保留“撤消”功能的点阵列。
如果您想制作矢量绘图程序,则必须保留各个基本操作(例如直线,矩形等)。在那种情况下,保持图像以便快速重新绘制仍然是值得的,现在技巧变成如何在用户修改绘图时有效地更新该图像(例如通过调整矩形的大小)。一种方法是将绘图区域平铺为许多较小的绘图区域,因此您只需要重新计算与用户正在修改的对象相交的部分的基础图像。
在这两种技术中,您只使用双缓冲,以便用户不会感觉到闪烁。但单独使用双缓冲,“重绘整个点”仍然会很慢。
答案 1 :(得分:1)
由于你没有提供任何代码,我猜你正在使用原始绘图方法(比如画线或点)。
一个好的选择是使用Double Buffering技术来进行绘画。
答案 2 :(得分:1)
查找GeneralPath。
你可以做的是创建一个Shape类,它会根据你要绘制的内容而变化(Rectangle,Triangle,Point,Line等)。你应该这样做,即使现在你只是画点。
当您创建Shape时,代码会检查要创建的Shape,例如switch / case语句:
...
case PENCIL:
if (generalPath == null) {
generalPath = new GeneralPath();
generalPath.moveTo(p1.x, p1.y);
} else {
generalPath.lineTo(p2.x, p2.y);
}
shape = generalPath;
break;
...
在绘制的代码中,只需调用repaint并绘制Shape。