在固定绘图上绘制移动点

Draw a moving point on a fixed draw

我正在尝试执行以下操作:

  1. 打开一个新表格并画几条直线和圆弧(效果很好)。
  2. 当一个事件发生时,一个新的坐标(x1,y1)被计算出来,并且一个 应在该坐标处绘制小圆圈。
  3. 当下一个事件发生时,应该画一个小圆圈在 (x2,y2),第一个圆应该消失,同时保持 在步骤 1 中绘制的直线和圆弧。

如何删除第一个圆圈,同时保留所有其他圆圈? 谢谢

圆圈一旦画好,就无法删除。所以,你需要用背景颜色清除整个canvas并重绘所有内容。

因此,您需要:

  1. 想出一堆 "shape" classes 来表示每条线和每个方舟和每个圆圈。它们可能都来自一些共同的基础 "Shape" class,它提供了所有形状共有的方法,例如,在 canvas.[=10= 上绘制形状的方法]

  2. 实例化这些 class 中的对象以表示应该在屏幕上绘制的形状,并在应用程序的整个生命周期中将这些对象保存在列表中。

  3. 当事件发生时,您对形状进行了任何更改(在您的情况下,删除一个圆并添加另一个圆,或者更可能的是,更改现有圆的坐标而不删除它并将其重新插入列表中,) 然后您需要使您可能用于绘画的 canvas 控件无效,(搜索 "Invalidate" 以获取文档,)以便导致 canvas 重绘自身。

  4. 您重写 canvas 控件的绘制方法以进行绘制:首先将控件清除为其背景色,然后遍历形状列表,调用每个形状在 canvas.

  5. 上绘制自己

当然这样会造成闪烁;如果这是不可接受的,那么您将需要阅读如何实施 "double buffering"(查找)以消除闪烁。

另一种消除闪烁的方法是只擦除并重新绘制发生变化的区域。在您的情况下,这将是包含旧位置的圆和新位置的圆的最小矩形。因此,不是使整个 canvas 无效,而是仅使那个矩形无效。这种方法的问题是,穿过无效区域的其他形状可能看起来重绘得有些不准确。这可能是不能接受的,也可能是可以接受的,你不试试就知道了。

你不能按照你想的那样,因为图形的工作方式类似于 MSPaint(二维像素阵列,当它被绘制时,它被绘制)而不是 Adob​​e Photoshop(图层或对象可以独立移动)

最简单的做法是自己实现类似 photoshop 的功能,并保留例如您要绘制的所有内容的列表,从列表中绘制(列表包含一个圆圈),然后从列表中删除该圆圈,添加另一个并从列表

中重新绘制整个 canvas

我知道这看起来很浪费,您可能会了解在绘制第一个圆圈时保存绘制的像素并恢复它们以擦除圆圈的机制,但这比完全放弃要复杂得多每次都重新开始