本文介绍了如何使用ActionScript 3.0创建拖放功能?多个项目被拖动到多个目标的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Adobe Animate中创建了一个互动纸娃娃,并且使拖动功能发挥了一些困难。我有多件衣物需要被拖到同一区域。例如,我可能有4种不同的衬衫选择。我从两件衣服开始(黄色dress_mc& blue dress_mc)。黄色的衣服正常工作,但蓝色的连衣裙不会起作用,我可以拖动它,但不要掉下来。任何建议?

I am creating an interactive paper doll in Adobe Animate and am having some trouble making the drag drop feature work. I have multiple clothing items that will need to have the possibility of being dragged to the same area. For example I may have 4 different shirt options. I have started with the two dresses (yellow dress_mc & blue dress_mc). The yellow dress is working properly, but the blue dress won't work, I can drag it, but not drop it. Any suggestions?

这是我现在的代码:

var objectoriginalX:Number;
var objectoriginalY:Number;

flower_mc.buttonMode = true;
flower_mc.addEventListener(MouseEvent.MOUSE_DOWN, pickupObject);
flower_mc.addEventListener(MouseEvent.MOUSE_UP, dropObject);

yellowdress_mc.buttonMode = true;
yellowdress_mc.addEventListener(MouseEvent.MOUSE_DOWN, pickupObject);
yellowdress_mc.addEventListener(MouseEvent.MOUSE_UP, dropObject);

bluedress_mc.buttonMode = true;
bluedress_mc.addEventListener(MouseEvent.MOUSE_DOWN, pickupObject);
bluedress_mc.addEventListener(MouseEvent.MOUSE_UP, dropObject);

function pickupObject(event:MouseEvent):void {
event.target.startDrag(true);
event.target.parent.addChild(event.target);
objectoriginalX = event.target.x;
objectoriginalY = event.target.y;
}
function dropObject(event:MouseEvent):void {
event.target.stopDrag();
var matchingTargetName:String = "target" + event.target.name;
var matchingTarget:DisplayObject = getChildByName(matchingTargetName);
if (event.target.dropTarget != null && event.target.dropTarget.parent == 
matchingTarget){
event.target.removeEventListener(MouseEvent.MOUSE_DOWN, pickupObject);
event.target.removeEventListener(MouseEvent.MOUSE_UP, dropObject);
event.target.buttonMode = false;
event.target.x = matchingTarget.x;
event.target.y = matchingTarget.y;
} else {
event.target.x = objectoriginalX;
event.target.y = objectoriginalY;
}
}


推荐答案

'建议不要在拖动的对象上使用MOUSE_UP。在少数情况下可能会失败。另外,最好把拖动的对象放在前面。

I'd suggest not using MOUSE_UP on dragged objects. It may fail in few cases. Also, it's a good idea to bring the dragged object to front.

var Drugs:Array = [flower_mc, yellowdress_mc, bluedress_mc];

for each (var aDrag:MovieClip in Drugs)
{
    aDrag.buttonMode = true;
    aDrag.useHandCursor = true;
    aDrag.addEventListener(MouseEvent.MOUSE_DOWN, dragObject);
}

var orig:Point;
var drag:MovieClip;

function dragObject(e:MouseEvent):void
{
    drag = e.currentTarget as MovieClip;
    orig = new Point(drag.x, drag.y);

    // Bring to front and start drag.
    drag.parent.setChildIndex(drag, drag.parent.numChildren - 1);
    drag.startDrag();

    // Handle drop cases.
    stage.addEventListener(Event.MOUSE_LEAVE, dropObject);
    stage.addEventListener(MouseEvent.MOUSE_UP, dropObject);
}

function dropObject(e:Event):void
{
    // Stop handling drop cases.
    stage.removeEventListener(Event.MOUSE_LEAVE, dropObject);
    stage.removeEventListener(MouseEvent.MOUSE_UP, dropObject);

    // This event goes from stage so we will work
    // with the "drag" reference saved earlier.

    // Sanity check in case something went wrong
    // and the reference is empty.
    if (!drag) return;

    drag.stopDrag();

    var aMatch:DisplayObject = getChildByName("target" + drag.name);
    var aTarget:DisplayObject = drag['dropTarget'];

    // This is your condition so I leave it as is.
    if ((aTarget !== null) && (aTarget.parent == aMatch))
    {
        drag.x = aMatch.x;
        drag.y = aMatch.y;
        drag.buttonMode = false;
        drag.useHandCursor = false;
        drag.removeEventListener(MouseEvent.MOUSE_DOWN, dragObject);
    }
    else
    {
        drag.x = orig.x;
        drag.y = orig.y;
    }

    // Clean up.
    drag = null;
    orig = null;
}

这篇关于如何使用ActionScript 3.0创建拖放功能?多个项目被拖动到多个目标的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-29 12:38