Flash水平拖动;掉线问题

时间:2012-05-06 01:12:40

标签: actionscript-3 flash drag-and-drop

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

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

我有一些工作,但它有问题但我不知道出了什么问题。我没有经验丰富的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。如果它被一个像素关闭,我放开鼠标按钮,拖动将继续。然后我必须回到线上,再次点击然后放开。我想这样做,无论我放开鼠标按钮的位置,拖动都会停止。或者当鼠标离开舞台时。
  3. 这可能只是缺乏经验。我不知道有哪些功能可以处理这个功能。所以我在这里问这个问题。与此同时,它有机会获得有关代码的一些反馈。

1 个答案:

答案 0 :(得分:4)

以下是我的建议,以指出你在拖拉机方面遇到的问题。下降。

问题1: 只需在黑线后面创建一个隐形容器,以便'test'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 eventlistener添加到舞台而不是'test'MovieClip会更好。只需使用:

this.stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);