Я думаю, что метод defmeta является лучшим, если возможно сделать все, чтобы быть потомками «основного» перетаскиваемого объекта - он самый быстрый (с точки зрения времени отклика пользовательского интерфейса) и самый простой и требует наименьшего количества кода .
Если это не вариант, в вашем распоряжении есть пара других методов:
- Если вы используете Flex, вы можете заставить другие объекты двигаться вместе с картой, прослушивая MoveEvent .MOVE события на нем и перемещаясь соответственно
- Вы можете самостоятельно реализовать функцию перетаскивания, чтобы иметь больше контроля над ней (см. Ниже).
Вот пример, который реализует функциональность перетаскивания для объекта, который также будет перемещать группу «родственных» объектов вместе с ним. В этом примере
- Любая переменная, начинающаяся с подчеркивания, является закрытым членом класса, содержащего этот код
_siblings
- это словарь, в котором ключами являются другие объекты, которые необходимо переместить.
.
private var _dragStartCoordinates:Point = null;
private var _siblingsDragStartCoordinates:Dictionary = null;
private function mouseDownHandler(event:MouseEvent):void
{
this.startDrag();
_dragStartCoordinates = new Point(this.x, this.y);
_siblingsDragStartCoordinates = new Dictionary(true);
for (var sibling:DisplayObject in _siblings)
{
_siblingsDragStartCoordinates[sibling] = new Point(sibling.x, sibling.y);
}
stage.addEventListener(MouseEvent.MOUSE_UP, dragMouseUpHandler, false, 0, true);
stage.addEventListener(MouseEvent.MOUSE_MOVE, dragMouseMoveHandler, false, 0, true);
}
private function dragMouseUpHandler(event:MouseEvent):void
{
stage.removeEventListener(MouseEvent.MOUSE_UP, dragMouseUpHandler, false);
stage.removeEventListener(MouseEvent.MOUSE_MOVE, dragMouseMoveHandler, false);
this.stopDrag();
moveSiblings();
_dragStartCoordinates = null;
_siblingsDragStartCoordinates = null;
}
private function dragMouseMoveHandler(event:MouseEvent):void
{
moveSiblings();
}
// expects _dragStartCoordinates and _siblingsDragStartCoordinates
// to be set
private function moveSiblings():void
{
var xDiff:Number = this.x - _dragStartCoordinates.x;
var yDiff:Number = this.y - _dragStartCoordinates.y;
for (var sibling:DisplayObject in _siblings)
{
sibling.x = _siblingsDragStartCoordinates[sibling].x + xDiff;
sibling.y = _siblingsDragStartCoordinates[sibling].y + yDiff;
}
}