为什么Flash使用蒙版对象的整个高度而不仅仅是可见区域?

时间:2011-07-25 18:08:36

标签: flash actionscript-3 mask

问题是如果我设置 Sprite 对象的 .mask 属性,当我调用 Sprite.height 时, Sprite 对象仍然会返回它的全高。所以我认为克服这种情况的一种简单方法是覆盖属性getter。

现在......即使这样有效,如果我将这个蒙版的 Sprite 对象添加到另一个 Sprite 对象,新的 精灵 对象会将其高度报告为蒙版 精灵 对象的高度,即使我已覆盖该属性仅返回由于蒙版而导致的可见区域的高度。因此,Flash似乎忽略了这样一个事实,即并非所有内容都可见,但仍会自动增加新的 Sprite 对象的高度,就像蒙版上没有蒙版一样 的Sprite

所以我想知道是否有解决方法,所以我可以将这个蒙版对象添加到任何其他 DisplayObject ,因为知道它将仅调整为屏蔽中可见的内容对象

感谢您的帮助。

修改

这是一个代码示例..

var content:Bitmap = new Bitmap(new BitmapData(50, 100, false, 0x000000));
var container:Sprite = new Sprite();
var mask:Bitmap = new Bitmap(new BitmapData(50, 50, false, 0x000000));

container.mask = mask;

container.addChild(content);

trace(container.height) // this should return 50 instead of 100

4 个答案:

答案 0 :(得分:2)

所以对于那些感兴趣的人我设法提出了一个解决方法。真正令我烦恼的是 DisplayObject.scrollRect 不会立即更新尺寸,所以在Adobe下车并修复之前,这就是你需要做的事情。

正如我所提到的, .scrollRect 的问题在于,在帧过去之后或经过一定时间之后,它不会调整到新的宽度和高度。无论哪种方式,我基本上构建了我的类,以便一旦设置了 .scrollRect ,我创建一个每毫秒运行一次的计时器,检查 .width .height 已更新为新值。一旦有了,我就会调度一个自定义的 READY 事件,在将该类添加到舞台之前,父对象会侦听它。

现在,您需要了解的有关此属性的一个 非常 重要事项是您要设置 .scrollRect 必须先将属性添加到舞台,然后才会尝试将其宽度和高度值更新为 .scrollRect 属性中设置的值。为了尽可能干净,我将 Stage 对象从我的主类传递给我想调整 .scrollRect 的对象,让我们称之为 MyClass 即可。 MyClass 将其 .visible 属性设置为false,然后将自身添加到舞台。 只有在完成此操作后,我现在可以启动我的1ms计时器,以便在设置 .scrollRect 后检查尺寸是否已正确更改。

因此,一旦计时器刻度处理函数看到维度已成功更改, MyClass 现在可以将 MyClass.READY 事件发送到主类,同时,将其 .visible 属性设置为true并将其从舞台中移除。当触发主类的事件监听器时,它现在可以将 MyClass 添加到任何想要的位置,因为它知道它将具有 MyClass.scrollRect 中设置的正确尺寸。 / p>

对于我自己以及可能寻找解决方案的许多其他开发人员来说,这是一个巨大的痛苦,所以我希望这对您有所帮助,并且现在就足够了,直到Adobe对此做了些什么。感谢之前发布过试图提供帮助的所有人,非常感谢,谢谢!

答案 1 :(得分:2)

正如xLite所提到的,它会在下一帧渲染时更新宽度和高度。所以你可以做些什么来强制它渲染。

 var content:Bitmap = new Bitmap(new BitmapData(50, 100, false, 0x000000));
 var container:Sprite = new Sprite();
 content.scrollRect = new Rectangle(0, 0, 50, 50);

 container.addChild(content);

 new BitmapData(1,1).draw(content);//this line would help
 trace(container.height);

答案 2 :(得分:0)

如果你找不到直接的解决方案,你可以尝试的一件事是:

  1. 将子项(包含掩码和maskee的DisplayObject)绘制到BitmapData对象。
  2. 解析BitmapData对象的像素,并使用BitmapData的getPixel32()方法检查Alpha通道的值。
  3. 确定绑定所有非零alpha像素的边界框,并使用这些尺寸。
  4. 我用getMaskedDimensions(child:DisplayObject):Rectangle方法将所有内容包装起来。如果您需要更多详细信息,请告诉我们。否则,祝你好运!

答案 3 :(得分:0)

可以覆盖宽度和高度。对象将始终具有与其内部渲染内容相对应的固有宽度和高度,并且遗憾的是,内在宽度和高度永远不会考虑遮罩区域。 getRect和getBounds对掩码也不敏感,因此它们本身也不够。

您需要做的是编写一个名为“getMaskSensitiveRect”的递归方法,该方法对掩码很敏感。您不必在每个子对象上交叉getRect的结果,而是首先测试每个子对象的mask属性是否为null,如果它不为null,则在掩码而不是对象上调用getRect,并将其用作子对象的矩形与其余的子对象。并且你必须将所有孩子,孙子等的整个等级划分到最深层才能获得准确的度量,因为如果不考虑单个面具,它可能会炸掉它的大小。

请记住覆盖宽度和高度的setter,因为更改DisplayObject的宽度或高度实际上会改变它的比例,并且它相对于内在大小而不是被覆盖的宽度和高度。你需要在setter中做的就是调用你的getMaskSensitiveRect方法,然后使用它和你想要的宽度计算一个比例,然后将比例分配给scaleX和scaleY属性。