1

我创建了一个可以在舞台上拖放的精灵。精灵被蒙版,并且它的面具是孩子,所以它也将与精灵一起拖动。一切正常,直到我向精灵添加阴影过滤器。添加投影时,如果鼠标事件发生在精灵添加到舞台时的原始位置内,我只能使用 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");
    }
4

1 回答 1

1

thumb您也可以通过将剪辑包装到容器中来解决此问题。设置cacheAsBitmaptrue调整事件处理。

    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);

所以也许你不必为你的阴影处理第二个精灵。希望这会有所帮助.. 问候..

于 2010-06-14T21:14:03.690 回答