09
2015
07

flash中的width和height

关于flash中DisplayObject的width和Height属性,目前已经遇到两个坑。

1、显示对象旋转之后,width和Height属性和预想的不一样。


比如有一个200*100的影片剪辑mc,直接trace(mc.width,mc.height),输出的应该是200 100。

如果先设置mc.rotation=90,再trace(mc.width,mc.height),输出就变成了100 200。

如果设置mc.scaleX=2;再trace(mc.width,mc.height),输出结果为400 100。

如果先设置mc.rotation=90;再设置mc.scaleX=2;再trace(mc.width,mc.height),输出结果应该是什么呢?旋转90度,宽高变成了100 200,然后宽放大两倍,变成了200 200,我已开始也是这么想的。可是实际输出的是100 400。

也就是说,不管显示原件怎么旋转,当我们设置scaleX的时候,永远是以元件自身的x轴为准的。所以才会有上面的结果。


接下来,我们直接设置元件的width和height属性。

如果我们直接设置mc.width=400;再trace(mc.width,mc.height),得到的肯定是400 100.

如果我们先设置mc.rotation=90;再设置mc.width=400;再trace(mc.width,mc.height);输出结果会是什么呢?通过上面的例子,我觉得应该是100 400;可是实际输出的却是100 800 。

也就是说,当我们设置可视元件的宽高的时候,并不是直接设置的它的宽高,而是,根据设置的宽高值,与当前元件的宽高值相除,得到一个比例,然后用这个比例去设置元件的scaleX和scaleY属性。

刚才的例子中,元件旋转之后,宽高是100 200,当我们设置其宽是400的时候,首先计算_scaleX=400/100=4;然后设置mc.scaleX*=_scaleX;相当于mc.rotation=90;mc.scaleX*=4;结果就是100 800 了。


为什么会这样,adobe为什么要做的这么恶心。

获取可视元件的宽高并不是一件简单的事情,width和height并不是直接存储的变量,而是通过get set方式实现的,因为当我们为元件添加子元件,或者用graphic画矢量图的时候,元件的宽高是会发生变化的,因此每次读取属性,都要计算一次。至少以我现在的水平,还不会计算其宽高。

我们知道显示原件的transform属性里边有一个matrix属性,matrix记录或者实现了元件的旋转、平移、缩放,还有变形。以2维为例,matrix是一个3*3的矩阵,任何旋转平移缩放,都可以看成是矩阵的运算,而我们知道矩阵A*矩阵B和矩阵B*矩阵A的结果是不一样的,也就是说改变旋转平移缩放的顺序,将得到不同的结果。如果真的这么做,用起来会更恶心。

可能不同的人来实现,会设计出不同的方案,flash中有一个as文件(fl.motion包里面的MatrixTransformer.as),里边有具体的实现。可以看看源码。


说了这么多,如果真的遇到了,既要旋转,又要缩放,怎么解决呢?

其实很简单,多套一层就可以了。把mc放到mc2里边,然后旋转的时候,设置mc.rotation,获取宽高的时候用mc2.width,mc2.height。


2、元件或者元件的子元件的visible=false之后,扔参与计算width和height。

影片剪辑mc2里边放影片剪辑mc,设置mc2.mc.visible=false;trace(mc2.width);我一开始以为会是0,结果却是200。暂时没想明白为什么会这样。遇到的时候要注意。


还有一个地方需要注意,就是fla中显示的宽高和as读取的宽高可能不一样,就像上面我在flash中画的影片剪辑,显示的宽高是200 100,可是trace出来的却是201 101。可能和getRect和getBounds有关系,一直没搞明白这两个。


« 上一篇下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。