У меня есть собственный виджет, основанный на Canvas, который отображает некоторые элементы, которые пользователь может перетаскивать. Когда пользователь перетаскивает что-либо, я использую Изображение перетаскиваемого элемента в качестве перетаскиваемого изображения:
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...
}
});
Это работало нормально, пока я не реализовал анимацию элементов в Canvas, чтобы указать пользователю, как элементы будут переставлены, если произойдет отбрасывание. То есть он по-прежнему отлично работает на всех платформах (GTK, Mac), кроме Windows. В Windows это выглядит так, как будто я перемещаю мышь, платформа делает снимок текущего содержимого Canvas, создает перетаскиваемое изображение сверху и помещает (непрозрачный) результат на экран. Очевидно, что этот механизм приводит к ужасным результатам, когда фон на самом деле анимируется и изменяется, когда мышь не двигается. В области, где появляется перетаскиваемое изображение, по-прежнему отображается содержимое во время последнего перемещения мыши, а область вокруг перетаскиваемого изображения анимируется и обновляется.
Решение, которое приходит на ум, заключается в том, чтобы самостоятельно реализовать перетаскивание изображения, вручную перемещая прозрачную оболочку нестандартной формы вместе с мышью. Прежде чем я это сделаю, верна ли моя интерпретация проблемы и, возможно, есть простое решение, которое исправило бы рендеринг перетаскиваемого изображения на анимированном фоне в Windows?