我创建了一个可以在舞台上拖放的精灵。精灵被蒙版,并且它的面具是孩子,所以它也将与精灵一起拖动。一切正常,直到我向精灵添加阴影过滤器。添加投影时,如果鼠标事件发生在精灵添加到舞台时的原始位置内,我只能使用 mousedown 拖放精灵。
我该如何解决这个问题?这可能是 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 属性会自动设置为 true,并且如果显示对象应用了过滤器,则该显示对象的 cacheAsBitmap 报告为 true,即使如果您将该属性设置为 false。如果清除显示对象的所有过滤器,cacheAsBitmap 设置将更改为上次设置的值。1
所以我相信这个错误是由同一个容器精灵中有 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");
}