我有一个带有Sprite元件的Flash库,这些元件是由设计时应用的滤镜的其他精灵组成的。我将这些符号嵌入到Flex应用程序中,如下所示:
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
[Bindable]
[Embed(source="Resources.swf", symbol="SquareContainer")]
private var squareContainer_class:Class;
private function log(msg:String):void {
output.text = output.text + "n" + msg;
}
]]>
</mx:Script>
<mx:VBox horizontalAlign="center" width="100%" height="100%" >
<mx:Image id="squareContainer" source="{squareContainer_class}"/>
<mx:Button click="log(squareContainer.width + ', ' + squareContainer.height);"/>
<mx:TextArea id="output" width="100%" height="100%" />
</mx:VBox>
</mx:Application>
在本例中,SquareContainer元件的宽度为100px,高度为100px;但是,它包含一个带有发光和模糊滤镜的子子精灵,这会使精灵看起来明显大于100x100。因为我不能确定容器的组成,所以我不能使用BitmapData.GenerateFilterRect()来获取应用于嵌套精灵的过滤器。
我怎样才能得到精灵加上滤镜的大小?
4条答案
按热度按时间lrpiutwd1#
哦,甜蜜的成功!(谢谢你的提示)我的一个朋友用一个很好的递归函数帮助解决了这个问题,该函数可以处理嵌套的精灵上可能存在的过滤器:
oxosxuxt2#
这里有一个略有不同的方法:只需将整个对象绘制到
BitmapData
中,然后计算位图非透明区域的边界。这种方法可能性能更好,尤其是在复杂对象上。2w3rbyxf3#
我不确定使用getBound或getRect的普通方法是否可能做到这一点,因为这些方法只返回正常的100x100正方形。
我有几个建议给你。
首先,您可以动态应用筛选器。这样你就有了过滤器的数字,你可以编程计算出实际的大小。
你可以在FLA的电影剪辑中添加第二层,它的大小与原始正方形相同,外加所有滤镜。然后将该正方形的Alpha设置为零
第三,你可以在FLA中只有一个PNG,它包含了正方形和,比如说,它里面的光芒。
就我个人而言,我会选择中间选项,因为如果过滤器或原始正方形发生变化,它需要的维护量最少。
uqdfh47h4#
好吧,有好消息也有坏消息。坏消息是,真的没有一种有效的方法来“以正确的方式”做到这一点。好消息是,有一种足够的方法来近似它。
一般规则是宽度的大小大约是(filter.blurX1.5)+sprite.width,其中“Filter”是sprite.Filters数组中的滤镜。同样的道理也适用于肤色和身高。另一个一般规则是最小值x变成sprite.x-(filter.blurX1.5)/2;
这些数字都不是Adobe官方的,但工作在合理的误差范围内,可以允许您在此基础上创建一个BitmapData。