那么,我最终重写了AbstractPositioningDropController
(FlowPanelDropController
的父亲)并添加了一些额外的功能。
1)newPositioner()
方法现在建立标签,这是垂直空间有一些小的宽度,高度和装饰。这个小部件的元素具有不变的id
(比如“POSITIONER”),如果您计划在使用拖放对象在多个放置目标上进行导航时计划放置其中的几个,这有助于区分多个定位器。还有一些transition
CSS效果被应用于Label,它将负责处理Label宽度的动画扩展。
2)onEnter()
我做了以下
...
removePositioner(getPositionerElement());
Widget positioner = newPositioner();
dropTarget.insert(positioner, targetIndex);
animatePositionerExtension();
其中getPositionerElement()
回报DOM.getElementById(POSITIONER)
同时removePositioner(..)
此元素的ID重置为抽象的东西和理想情况下应该调用.removeFromParent()
之前提供一些动画。但是我没有足够的时间来正确地调试,所以最后只是删除了没有动画的旧定位器。
方法animatePositionerExtension()
包含更改定位器小部件宽度的代码,以便CSS transition
可以捕捉并提供动画。
应该通过更新的方法提供对类中定位器小部件的所有访问权限。
3)onLeave()
包含线removePositioner(getPositionerElement());
4)在onMove()
结束我添加几行:
galleryWidget.extendHoveredRow(targetIndex - 1);
animatePositionerExtension();
其中extendHoveredRow(hoveredWidgetOrdinal)
实现的逻辑为“限制”的滑动效果在单line:
int rowHovered = -1;
public void extendHoveredRow(int hoveredWidgetOrdinal) {
int newRowHovered = getRowByOrdinalHovered(hoveredWidgetOrdinal);
if (rowHovered != newRowHovered) {
// adjust position of items in the previously hovered row
int firstInPreviouslyHoveredRow = (rowHovered - 1) * itemsInARow;
shiftFirstItemLeft(firstInPreviouslyHoveredRow, false);
rowHovered = newRowHovered;
// extend this row
int firstInThisRow = getOrdinalFirstInThisRowByOrdinal(hoveredWidgetOrdinal);
shiftFirstItemLeft(firstInThisRow, true);
}
}
这简而言之我是如何做到的。还有一些改进空间,比如添加动画去除。
同样,这一切都是关于重写DropController和使用“图库”小部件中的元素进行操作。这种方法的好处是我仍然在gwt-dnd操作框架中,并重用了一堆现有的代码。
一些注意事项:
- CSS
transition
没有在IE前9支持,但这是无关 这个话题。
- 如果将 用作dragProxy的一个面,请在图像小部件的顶部放置一个透明的“玻璃”div。这将为您节省大量时间尝试 了解为什么要么将元素的
draggable
设置为false,要么 在其他地方调用event.preventDefault()
,或者其他解决方法在一个或多个浏览器中不起作用,并且图像本身被拖动而不是整个dragProxy小部件。
你可能在jQuery中尝试一些东西,然后使用GwtQuery将其移植。 – SSR 2013-04-04 16:14:32