0

我正在做一个我正在做的项目的非常简单的第一步:记忆时间线。基本上,上面列出了年份的时间表。这是一条线,您应该能够将其水平移动以转到您选择的年份,然后添加事件和信息。

现在,我正在尝试实现那条线,我想它必须是无限宽的,以及拖放功能。

我有一些工作,但它被窃听了,我不知道出了什么问题。我对Flash没有那么有经验,所以我在这里问。

这是代码。舞台是空的,时间线上没有代码。仅此一个 Document 类,从 Properties 创建:

package {

    import flash.geom.Rectangle;
    import flash.events.MouseEvent;
    import flash.display.Sprite;


    public class Document extends Sprite {

        // rootMc, global container
        public static var rootMc:Sprite = new Sprite();
        public var test:Sprite = new Sprite();

        public function Document() {
            test.graphics.beginFill(0x000000);
            test.graphics.drawRect(0, stage.stageHeight/2, 2000, 6);
            test.graphics.endFill();

            test.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
            test.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);

            addChild(rootMc);
            rootMc.addChild(test);
        }

        function mouseDownHandler(evt:MouseEvent):void {
            trace("mouseDownHandler");
            var sprite:Sprite = Sprite(evt.target);
            sprite.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
                    //Limit the drag to a horizontal rectangle
            sprite.startDrag(false, new Rectangle(0, sprite.y, 2000, 0));
        }

        function mouseUpHandler(evt:MouseEvent):void {
            trace("mouseUpHandler");
            var sprite:Sprite = Sprite(evt.target);
            sprite.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
            sprite.stopDrag();
        }

        private function mouseMoveHandler(evt:MouseEvent):void {
            trace("mouseMoveHandler");
            evt.updateAfterEvent();
        }
    }

}

问题是:

  1. 拖放仅在我完全单击该行时才有效。我希望上面和下面有一些空间,我也可以点击。但这条线绝对不能垂直移动,不能移动一个像素。我现在不知道如何实现这一点。
  2. 与第一个问题相关:只有当我的光标在线时才会调用 mouseUpHandler。如果它偏离了一个像素并且我松开鼠标按钮,拖动将继续。然后我必须回到线路上,再次单击并放手。我想做到这一点,以便无论我在哪里放开鼠标按钮,拖动都会停止。或者当鼠标离开舞台时。

这可能只是缺乏经验。我不知道存在哪些功能来处理此功能。所以我在这里问这个问题。同时,也有机会获得有关代码的一些反馈。

4

1 回答 1

4

这是我的建议,可以指出您在拖放方面遇到的问题。

问题 1:只需在黑线后面创建一个不可见的容器,以便“测试”MovieClip 变大。但只有黑线可见。您可以通过在绘制黑线之前添加以下代码来完成此操作:

test.graphics.beginFill(0xffffff,0); 
// white container with 0 alpha
test.graphics.drawRect(0, stage.stageHeight/2 - 10, 2000, 26); 
// start 10px before and end 10 px after
test.graphics.endFill();

问题 2:最好将 MouseEvent.MOUSE_UP 事件监听器添加到舞台,而不是添加到“测试”MovieClip。只需使用这个:

this.stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
于 2012-05-06T01:35:26.897 回答