关于旋转后缩放产生的问题解决方案

关于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。

上面是一个朋友的描述,下面是笔者自己的一些看法!

目前经过作者试验,通过直接设置宽高来缩放,也会出现该坑。

使用var matrix:Matrix=_curSprite.transform.matrix;
matrix.scale(curPercent,curPercent);
_curSprite.transform.matrix=matrix;,这种方式来进行缩放,可以避免该坑!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值