[AS3]as3基于Matrix类修改mc改变注册点、旋转图像等的实例源代码
1.如何使用Matrix类来改变注册点:
做相册功能时一开始最烦的就是注册点在(0,0)的位置,为了能方便的旋转、缩放操作,需要将注册点移动到中心,参考雪の猫的方法,做了简化:
- var ōbj=this.myImageBitmap; //要改变的图片或影片剪辑
- var matrix:Matrix = obj.transform.matrix;
- matrix.tx=0;
- matrix.ty=0;
- var halfW:Number = obj.width/2;
- var halfH:Number = obj.height/2;
- matrix.translate(-1*halfW,-1*halfH);
这样在旋转、缩放的操作时能看到注册点居中的效果,实际上就是利用transale函数将matrix属性的tx、ty值往左上角方向移动半个宽度和高度;
2.保存图像时为何一旦做过旋转操作就会看不到图片?
虽然用matrix平移的方法能改变注册点,而实际上AS3.0并没有能真正改变注册点(网上的其他方法也是),注册点还是在(0,0)点的,不过是这样对旋转、缩放会有注册点在中心的效果罢了。但是,一旦使用rorate函数进行了旋转,这个边角的注册点却会跟着移动,比如,将图片顺时针方向转90度,那么,原来在左上角的注册点,却会移动到右上角去了!
而保存图像的时候,AS3.0是将图片的注册点跟你的BitmapData对象的左上角对齐,这就不难想像保存后的图像会是什么样子了!如果图像没旋转,注册点就在(0,0),那保存在图像应该很完美;一旦向任意一个方向做了旋转,那么你将什么也看不到,因为图像的内容已经跑到BitmapData的范围之外了!
解决方法,就是在保存的时候,当调用BitmapData的draw(myImageBitmap.bitmapData, new Matrix() )方法写入图像时,将传入的Matrix再做一次正确的平移。
比如假设前提是只做每次90度旋转(像xp自带图片浏览器的旋转功能一样),那么在执行保存函数前做一次计算和平移,下面是简单的算法:
- var tx:Number = myMatrix.tx, ty:Number = myMatrix.ty;
- var tx1:Number = 0, ty1:Number = 0;
- if (tx < 0 && ty < 0)
- {
- tx1 = -1 * tx;
- ty1 = -1 * ty;
- }
- else if (tx > 0 && ty < 0)
- {
- txtx1 = tx;
- ty1 = -1 * ty;
- }
- else if (tx > 0 && ty > 0)
- {
- txtx1 = tx;
- tyty1 = ty;
- }
- else if (tx < 0 && ty > 0)
- {
- tx1 = -1 * tx;
- tyty1 = ty;
- }
- myMatrix.translate(tx1, ty1)
[AS3]as3基于Matrix类修改mc改变注册点、旋转图像等的实例源代码
热门文章推荐
- [HLS]做自己的m3u8点播系统使用HTTP Live Streaming(HLS技术)
- [FMS]FMS流媒体服务器配置与使用相关的介绍
- [AS3]什么是M3U8,与HTML5的区别是什么
- AS2.0 让flash自适应全屏,并且不自动缩放
- [AS3]as3.0的sound类常用技巧整理
- [AS3]as3与ByteArray详解、ByteArray介绍、ByteArray用法
- 关于RTMP,RTMPT,RTMPS,RTMPE,RTMPTE协议的介绍
- [JS]分享浏览器弹出窗口不被拦截JS示例