Actionscript 3 ActionScript使用遮罩和过滤器拖放显示对象?

Actionscript 3 ActionScript使用遮罩和过滤器拖放显示对象?,actionscript-3,drag-and-drop,filter,mask,Actionscript 3,Drag And Drop,Filter,Mask,我创造了一个精灵在舞台上拖拽。精灵被蒙上了面具,并将它的面具作为它的子对象,以便它也将与精灵一起拖动。在我为精灵添加阴影过滤器之前,一切都正常。添加放置阴影时,如果将精灵添加到舞台时,鼠标事件发生在精灵的原始位置内,则我只能使用鼠标向下拖动和鼠标上下拖动来放置精灵 我如何解决这个问题?这可能是10.1的问题吗?如果不是,我做错了什么 var thumbMask:Sprite = new Sprite(); thumbMask.graphics.beginFill(0, 1); thumbMask

我创造了一个精灵在舞台上拖拽。精灵被蒙上了面具,并将它的面具作为它的子对象,以便它也将与精灵一起拖动。在我为精灵添加阴影过滤器之前,一切都正常。添加放置阴影时,如果将精灵添加到舞台时,鼠标事件发生在精灵的原始位置内,则我只能使用鼠标向下拖动和鼠标上下拖动来放置精灵

我如何解决这个问题?这可能是10.1的问题吗?如果不是,我做错了什么

var thumbMask:Sprite = new Sprite();
thumbMask.graphics.beginFill(0, 1);
thumbMask.graphics.drawRoundRect(0, 0, 100, 75, 25, 25);
thumbMask.graphics.endFill();

var thumb:Sprite = new Sprite();
thumb.graphics.beginFill(0x0000FF, 1);
thumb.graphics.drawRect(0, 0, 100, 75);
thumb.graphics.endFill();

thumb.addEventListener(MouseEvent.MOUSE_DOWN, drag);
thumb.addEventListener(MouseEvent.MOUSE_UP, drop);

thumb.filters = [new DropShadowFilter(0, 0, 0, 1, 20, 20, 1.0, 3)];

thumb.addChild(thumbMask);
thumb.mask = thumbMask;
addChild(thumb)

function drag(evt:MouseEvent):void
    {
    evt.target.startDrag();
    trace("drag");
    }

function drop(evt:MouseEvent):void
    {
    evt.target.stopDrag();
    trace("drop");
    }
---------------- 更新的解决方案 ----------------

由于二进制文件的建议,使用cacheAsBitmap解决了这个问题。但是,当我将cacheAsBitmap应用到容器(容器中包含已应用放置阴影的蒙面拇指精灵)时,鼠标事件的工作效果不如预期。阅读文档后,我了解到向精灵添加过滤器会自动激活该精灵的cacheAsBitmap属性:

cacheAsBitmap属性为 每当您 将过滤器应用于显示对象 (当其过滤器阵列不为空时), 如果显示对象具有过滤器 应用于它时,cacheAsBitmap是 对于该显示,报告为true 对象,即使设置了属性 这是错误的。如果你清除了所有的过滤器 显示对象,即cacheAsBitmap 设置对上一次的更改 开始

因此,我认为该错误是由于在同一容器sprite中有2个cacheAsBitmap属性造成的。因此,在这种情况下,我只是将过滤器添加到容器中,而不是添加到蒙面拇指精灵中

var thumbMask:Sprite = new Sprite();
thumbMask.graphics.beginFill(0, 1);
thumbMask.graphics.drawRoundRect(0, 0, 100, 75, 25, 25);
thumbMask.graphics.endFill();

var thumb:Sprite = new Sprite();
thumb.graphics.beginFill(0x0000FF, 1);
thumb.graphics.drawRect(0, 0, 100, 75);
thumb.graphics.endFill();

thumb.addChild(thumbMask);
thumb.mask = thumbMask;

var container: Sprite = new Sprite();
container.addChild(thumb);
container.filters = [new DropShadowFilter(0, 0, 0, 1, 20, 20, 1.0, 3)];

//if there is no filters applied or if the filters array is empty, use:
//container.cacheAsBitmap = true;

addChild(container);

container.addEventListener(MouseEvent.MOUSE_DOWN, drag);
container.addEventListener(MouseEvent.MOUSE_UP, drop);

function drag(evt:MouseEvent):void
    {
    evt.target.startDrag();
    trace("drag");
    }

function drop(evt:MouseEvent):void
    {
    evt.target.stopDrag();
    trace("--DROP");
    }

你也可以通过将你的
拇指
夹包装到一个容器中来解决这个问题。 将
cacheAsBitmap
设置为
true
并调整事件处理

    thumb.filters = [new DropShadowFilter(0, 0, 0, 1, 20, 20, 1.0, 3)];

//  thumb.addEventListener(MouseEvent.MOUSE_DOWN, drag);
//  thumb.addEventListener(MouseEvent.MOUSE_UP, drop);

var cont: Sprite = new Sprite();
    cont.addChild(thumb);
    cont.cacheAsBitmap = true;
    cont.addEventListener(MouseEvent.MOUSE_DOWN, drag);
    cont.addEventListener(MouseEvent.MOUSE_UP, drop);

    addChild(cont);
所以也许你不必为你的dropshadow处理第二个精灵。 希望这有帮助。。
关于..

你也可以通过将你的
拇指
夹包装到一个容器中来解决这个问题。 将
cacheAsBitmap
设置为
true
并调整事件处理

    thumb.filters = [new DropShadowFilter(0, 0, 0, 1, 20, 20, 1.0, 3)];

//  thumb.addEventListener(MouseEvent.MOUSE_DOWN, drag);
//  thumb.addEventListener(MouseEvent.MOUSE_UP, drop);

var cont: Sprite = new Sprite();
    cont.addChild(thumb);
    cont.cacheAsBitmap = true;
    cont.addEventListener(MouseEvent.MOUSE_DOWN, drag);
    cont.addEventListener(MouseEvent.MOUSE_UP, drop);

    addChild(cont);
所以也许你不必为你的dropshadow处理第二个精灵。 希望这有帮助。。
关于..

虽然这仍然是一个未解之谜,但我已经设法一起破解了一个解决方案。我所做的就是从可拖动的面具精灵身上移除阴影。我创建了一个相同大小的精灵,并将其放置在显示列表中可拖动蒙版精灵的下方。我将阴影添加到这个新层,而不是蒙面精灵。新的阴影层通过添加和删除事件跟随遮罩精灵。分别为每个鼠标向下和鼠标向上输入\u帧。这个enter frame事件调用一个新函数来对齐蒙版精灵和新的阴影精灵。虽然这仍然是一个未解之谜,但我已经设法一起破解了一个解决方案。我所做的就是从可拖动的面具精灵身上移除阴影。我创建了一个相同大小的精灵,并将其放置在显示列表中可拖动蒙版精灵的下方。我将阴影添加到这个新层,而不是蒙面精灵。新的阴影层通过添加和删除事件跟随遮罩精灵。分别为每个鼠标向下和鼠标向上输入\u帧。此enter frame事件调用一个新函数来对齐蒙版精灵和新的放置阴影精灵。好的,我让它工作了。谢谢我已经使用您的建议更新了工作代码。这是一个比我的黑客更好的解决方案。哦,我刚刚发现了一个问题。似乎并不是所有包含的精灵都在调用鼠标按下事件。也就是蒙面直肠的右下方。啊,我知道了。问题是阴影。从文档中可以看出:“每当您将筛选器应用于显示对象时(当其筛选器数组不为空时),cacheAsBitmap属性将自动设置为true。”,并且如果显示对象应用了筛选器,则即使将属性设置为false,该显示对象的cacheAsBitmap也会报告为true。如果清除显示对象的所有筛选器,cacheAsBitmap设置将更改为上次设置的设置。“我已经更新了我的代码,以显示有效的解决方案并包含此解释。好的,我让它工作了。谢谢我已经使用您的建议更新了工作代码。这是一个比我的黑客更好的解决方案。哦,我刚刚发现了一个问题。似乎并不是所有包含的精灵都在调用鼠标按下事件。也就是蒙面直肠的右下方。啊,我知道了。问题是阴影。从文档中可以看出:“每当您将筛选器应用于显示对象时(当其筛选器数组不为空时),cacheAsBitmap属性将自动设置为true。”,如果显示对象应用了筛选器,则即使将属性设置为false,该显示对象的cacheAsBitmap也会报告为true。如果清除显示对象的所有筛选器,cacheAsBitmap设置将更改为上次设置的设置。“我已更新代码以显示工作解决方案并包含此解释。”。