Java SWT,在Windows上的动画背景上使用透明的拖动图像
我有一个基于画布的自定义小部件,它显示一些用户可以拖动排序的项目。当用户拖动某物时,我将使用被拖动项目的图像作为拖动图像:Java SWT,在Windows上的动画背景上使用透明的拖动图像,java,windows,image,swt,drag-and-drop,Java,Windows,Image,Swt,Drag And Drop,我有一个基于画布的自定义小部件,它显示一些用户可以拖动排序的项目。当用户拖动某物时,我将使用被拖动项目的图像作为拖动图像: final DragSource source = new DragSource(this, DND.DROP_MOVE); source.setDragSourceEffect(new DragSourceEffect(this) { @Override public void dragStart(DragSourceEvent event) {
final DragSource source = new DragSource(this, DND.DROP_MOVE);
source.setDragSourceEffect(new DragSourceEffect(this) {
@Override
public void dragStart(DragSourceEvent event) {
event.image = // do some stuff to generate a partially
// transparent image of the dragged item...
}
});
这很好,直到我实现了在画布中设置项目的动画,以向用户指示如果发生拖放,项目将如何重新排列。也就是说,它在除Windows之外的所有平台(GTK、Mac)上都能完美工作。在Windows上,每当我移动鼠标时,平台都会对当前画布内容进行快照,在顶部合成拖动图像,并将(不透明)结果显示在屏幕上。显然,当鼠标不移动时,背景实际设置动画并改变时,这种机制会产生可怕的结果。拖动图像出现的区域在最后一次鼠标移动时仍显示内容,而拖动图像周围的区域将设置动画并更新
想到的解决方案是通过手动移动一个透明的、自定义形状的外壳以及鼠标来实现一个拖动图像。在我开始之前,我对这个问题的解释是否正确,是否有一个简单的解决方案可以修复Windows上动画背景下的拖动图像渲染?在拖动过程中重画似乎是一个非常头痛的问题,并且有一个针对您的具体情况的报告。因此,您的解释是正确的,因为(在Windows上?)拖动不会导致重新绘制/更新基础控件(如果您自己强制执行,您只会得到很多奶酪)。非常感谢您确认问题并分担痛苦。我只是实现了自己的DND处理。只要按下鼠标,我就会为鼠标移动事件安装一个全局事件过滤器,并使用一个透明的形状窗口作为拖动图像,我会随鼠标移动。这给了我额外的自由来处理拖动事件,即使鼠标实际上在我的目标小部件之外,但“拖动图像”仍然主要位于可接受的放置位置。