关于旋转后缩放产生的问题解决方案
2015-10-23 13:40
267 查看
关于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;,这种方式来进行缩放,可以避免该坑!
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;,这种方式来进行缩放,可以避免该坑!
相关文章推荐
- 《数据分析的统计基础》学习笔记(二) 描述性统计分析
- Object-C与Swift的混合编程
- POJ 2391 最大流 二分 拆点 floyd
- 运行Hadoop伪分布式实例
- 高效分布式数据库缓存经典解决方案
- Java快速从一个文件夹复制到另外一个文件夹
- 自定义标签 titlebar
- Effective Java Chapter 1
- sqlite docs
- Jmeter关联
- php生成代金券码
- 高版本的JavaCV是可以调用低版本的openCV的
- wireshark添加tcp.stream列
- 开源项目:底部动作条(BottomSheet)
- 取得手机SDcard的大小和可用空间
- Xcode上传App到Appstore,报错Error ITMS-90049:"This bundle is invalid.The bundle..
- PHP 教程
- 欢迎使用CSDN-markdown编辑器
- Linux 常用的一些经验
- Linux系统中strace命令的使用教程