AS3拖动问题

时间:2017-09-15 15:06:12

标签: actionscript-3 flash air

我有一个电影剪辑列表,每个剪辑都有很多孩子的

stage.addEventListener(TouchEvent.TOUCH_BEGIN, fl_TouchBeginHandler);
stage.addEventListener(TouchEvent.TOUCH_MOVE, fl_TouchMoveHandler);

var last_posY: Number;
function fl_TouchBeginHandler(eve: TouchEvent): void {

    last_posY= eve.stageY;
}
function fl_TouchMoveHandler(eve: TouchEvent): void {
    for(var i=0;i<movieClipsArray.lenght;i++){
        movieClipsArray[i].y-=eve.stageY - delta_posY;
 }
    last_posY= eve.stageY;
}

我正在尝试滚动电影片段的列表,当我在舞台的一部分空白但是当我在电影片段上拖动它有问题时(例如在滚动它没有任何理由时摇动)和之后我发现了一些我发现的时候我发现了eve.target changs(从其中一个电影剪辑嵌套的孩子到另一个)eve.stageY改变了导致摇动的有线方式,我该如何防止呢?

1 个答案:

答案 0 :(得分:0)

您的问题与计算y职位的方式最相似。如果您希望它是相对的,则必须仅使用delta值(并且仅使用stageY值来确定向上或向下)

var direction:int = eve.stageY > lastPosY ? 1 : -1; //if the latest mouse/touch position is greater than before (lower on the screen), use a value of 1 (down)
movieClipsArray[i].y -= delta_posY * direction; //multiply the delta by the direction

也就是说,您可能会发现使用容器和滚动容器要容易得多。如果您正在使用AnimateCC,您可以选择所有剪辑,点击F8并制作一个包含所有剪辑的新MovieClip。或者,通过代码来完成:

var container:Sprite = new Sprite();
addChild(container);

container.addChild(mc1); //do this for all your clips instead of using an array

然后修改你的代码:

stage.addEventListener(TouchEvent.TOUCH_BEGIN, fl_TouchBeginHandler);
stage.addEventListener(TouchEvent.TOUCH_MOVE, fl_TouchMoveHandler);

var offset: Number = 0;
function fl_TouchBeginHandler(eve: TouchEvent): void {
    offset = container.y - eve.stageY;
    //offset is the initial difference between the touch point and container's y. You use this to make sure it doesn't jump when you first touch it
}

function fl_TouchMoveHandler(eve: TouchEvent): void {
    container.y = eve.stageY + offset
}