0

我正在尝试创建与此类似的地图应用程序。单击图像左侧的 SWF 预览选项卡。具体来说,注意您如何平移,地图上的可点击按钮随之移动。基本上,他们是怎么做到的?

我的应用程序有一个地图,您可以使用 startDrag() 函数单击并平移它。我有一个单独的图层,其中包含我想跟随地图图层的平移的其他可点击影片剪辑。不幸的是,Flash 限制您一次只能拖动一个影片剪辑。有人提出了一个使用原型的解决方案,但我无法让它正常工作,我不确定是不是因为我使用的是 ActionScript 3.0。

任何人都可以为我概述一种更好的方式来完成我正在尝试做的事情,或者更好的方式来完成我目前正在做的事情吗?欣赏它。

4

6 回答 6

3

简单的。将您的地图可点击按钮放入一个新的 MovieClip 中,您可以将其命名为interactiveMapContainer或类似的名称,然后在interactiveMapContainer上调用您的 startDrag 方法,一旦您拖动它,您仍然可以点击按钮。

Jakub Kotrla 的方法也可以很好地工作,尽管它稍微复杂一些。

于 2008-09-19T19:35:48.193 回答
2

我认为如果可以让所有东西都成为“主要”可拖动对象的子对象,我认为 defmeta 的方法是最好的方法——它是最快的(就 UI 响应时间而言)和最简单的,并且需要最少的代码。

如果这不是一个选项,您可以使用其他几种方法:

  • 如果您使用的是 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;
    }
}
于 2008-09-19T19:36:07.337 回答
1

我无法拖动您链接的任何 int SWF,只需通过 mouseWheel 进行缩放。

您可以使用事件 mousedown、mouseMove 和 mouseUp 一次拖动多个影片剪辑。

通过 Mouse.addListener(object) 为事件添加事件处理程序。

  • 在 mouseDown 中设置一些标志并记住当前鼠标位置。
  • 如果设置了标志,则在 mouseMove 中计算移动偏移量,只需更改要拖动的所有动画剪辑的 .x 和 .y。
  • 在 mouseUp 中将标志设置为 false
于 2008-09-19T19:23:52.980 回答
1

感谢 hasseg 的代码,节省了一点时间。这是我对公众使用的看法...

    package Tools
{
    import flash.display.MovieClip; 
    import flash.events.*; 
    import flash.geom.Rectangle; 
    import flash.utils.setInterval; 
    import flash.utils.clearInterval; 
    import flash.display.MovieClip;
    import flash.display.DisplayObject;
    import flash.display.Sprite;
    import flash.geom.Point;
    import flash.utils.Dictionary;

    public class DragSync { 
        private var _dragStartCoordinates:Point = null;
        private var _siblingsDragStartCoordinates:Dictionary = null;
        private var _primaryItem:Object = null;
        private var _dragWithPrimary:Array = null;

        public function DragSync(primaryItem:Object,dragWithPrimary:Array)
        {
            _primaryItem = primaryItem;
            _dragWithPrimary = dragWithPrimary;

            _primaryItem.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
            _primaryItem.addEventListener(MouseEvent.MOUSE_UP, dragMouseUpHandler);
            _primaryItem.addEventListener(MouseEvent.MOUSE_MOVE, dragMouseMoveHandler);
        }

        private function mouseDownHandler(event:MouseEvent):void
        {
            _dragStartCoordinates = new Point(_primaryItem.x, _primaryItem.y);
            _siblingsDragStartCoordinates = new Dictionary(true);

            for each (var sibling:DisplayObject in _dragWithPrimary)
            {
                _siblingsDragStartCoordinates[sibling] = new Point(sibling.x, sibling.y)
            }
        }

        private function dragMouseUpHandler(event:MouseEvent):void
        {
            moveSiblings();
            _dragStartCoordinates = null;
            _siblingsDragStartCoordinates = null;
        }

        private function dragMouseMoveHandler(event:MouseEvent):void
        {
            moveSiblings();
        }

        // expects _dragStartCoordinates and _siblingsDragStartCoordinates
        // to be set
        private function moveSiblings():void
        {
            if (!_dragStartCoordinates || !_siblingsDragStartCoordinates) return;

            var xDiff:Number = _primaryItem.x - _dragStartCoordinates.x;
            var yDiff:Number = _primaryItem.y - _dragStartCoordinates.y;

            for each (var sibling:DisplayObject in _dragWithPrimary)
            {
                sibling.x = _siblingsDragStartCoordinates[sibling].x + xDiff;
                sibling.y = _siblingsDragStartCoordinates[sibling].y + yDiff;
            }
        }


    } 
}
于 2009-03-03T20:43:32.097 回答
1

非常感谢你。我已将其更改如下: package { import flash.display.MovieClip; 导入 flash.events.*;导入 flash.geom.Rectangle;导入 flash.utils.setInterval;导入 flash.utils.clearInterval;导入 flash.display.MovieClip;导入 flash.display.DisplayObject;导入 flash.display.Sprite;导入 flash.geom.Point;导入 flash.utils.Dictionary;

public class DragSync { 
    private var _dragStartCoordinates:Point = null;
    private var _siblingsDragStartCoordinates:Dictionary = null;
    private var _primaryItem:Object = null;

私有 var _workSpace:Object = null; 私有变量 _dragWithPrimary:Array = null;

    public function DragSync(primaryItem:Object,workSpace:Object, dragWithPrimary:Array)
    {
            _primaryItem = primaryItem;
            _dragWithPrimary = dragWithPrimary;
_workSpace = workSpace;

            _workSpace.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
            _workSpace.addEventListener(MouseEvent.MOUSE_UP, dragMouseUpHandler);
            _workSpace.addEventListener(MouseEvent.MOUSE_MOVE, dragMouseMoveHandler);
_workSpace.addEventListener(MouseEvent.MOUSE_OUT, dragOut);
    }

    private function mouseDownHandler(event:MouseEvent):void
    {
            trace("event mouse down");
_primaryItem.startDrag();
_dragStartCoordinates = new Point(_primaryItem.x, _primaryItem.y);
            _siblingsDragStartCoordinates = new Dictionary(true);

            for each (var sibling:DisplayObject in _dragWithPrimary)
            {
                    _siblingsDragStartCoordinates[sibling] = new Point(sibling.x, sibling.y)
            }
    }

    private function dragMouseUpHandler(event:MouseEvent):void
    {
            moveSiblings();
_primaryItem.stopDrag();
            _dragStartCoordinates = null;
            _siblingsDragStartCoordinates = null;
    }

    private function dragMouseMoveHandler(event:MouseEvent):void
    {
            trace("event mouse MOVE MOVE");
moveSiblings();
    }

私有函数dragOut(事件:MouseEvent):无效{_primaryItem.stopDrag();}

    // expects _dragStartCoordinates and _siblingsDragStartCoordinates
    // to be set
    private function moveSiblings():void
    {
            if (!_dragStartCoordinates || !_siblingsDragStartCoordinates) return;

            var xDiff:Number = _primaryItem.x - _dragStartCoordinates.x;
            var yDiff:Number = _primaryItem.y - _dragStartCoordinates.y;

            for each (var sibling:DisplayObject in _dragWithPrimary)
            {
                    sibling.x = _siblingsDragStartCoordinates[sibling].x + xDiff;
                    sibling.y = _siblingsDragStartCoordinates[sibling].y + yDiff;
            }

    }


} 

}

于 2010-03-04T01:42:57.040 回答
0

您可以将影片剪辑添加到父剪辑并让事件处理程序拖动父剪辑吗?

于 2008-09-19T19:29:57.523 回答