AS3 以图片某点为中心进行缩放(改变缩放中心)

以元件自身座标系缩放: 

import flash.display.MovieClip;
import flash.geom.Point;
import flash.events.MouseEvent;
import com.greensock.TweenMax;
import com.greensock.easing.*;

image.addEventListener(MouseEvent.CLICK, clickHandler);

function clickHandler(event: MouseEvent): void {
var mc: MovieClip = event.currentTarget as MovieClip;
var point: Point = new Point(mc.mouseX, mc.mouseY);
scaleAtPoint(mc, point, mc.scaleX + 1);
}
function scaleAtPoint(target: MovieClip, point: Point, scale: Number): void {
var oldScale: Number = target.scaleX;
TweenMax.to(target, .7, {
scaleX: scale, scaleY: scale,
x: target.x - (point.x * scale - point.x * oldScale),
y: target.y - (point.y * scale - point.y * oldScale),
ease: Cubic.easeOut
});
}

如果不需要TweenMax动画类,下面是最初原版的scaleAtPoint函数:

function scaleAtPoint(target:MovieClip,point:Point,scale:Number):void{
    var stagePoint:Point = target.localToGlobal(point);
    target.scaleX=target.scaleY=scale;
    var currentStagePoint:Point = target.localToGlobal(point);
    target.x-=currentStagePoint.x-stagePoint.x;
    target.y-=currentStagePoint.y-stagePoint.y;
}


后来发现最好还是传入元件的外部座标系,因为有时候传入的是画布的中心点,方便不影响元件其它操作,(这里暂且mc.parent.mouseX代替)所以修改如下:
 

import flash.display.MovieClip;
import flash.geom.Point;
import flash.events.MouseEvent;
import com.greensock.TweenMax;
import com.greensock.easing.*;

image.addEventListener(MouseEvent.CLICK, clickHandler);
function clickHandler(e: MouseEvent): void {
    var mc:MovieClip=e.currentTarget as MovieClip;
    var newScale:Number=mc.scaleX + 1;
    //传入的是画布的座标系(这里是元件所在容器座标系)
    scaleAtPoint(mc, new Point(mc.parent.mouseX, mc.parent.mouseY), newScale);
}
function scaleAtPoint(target: MovieClip, newPose: Point, scale: Number): void {
    //获取当前目标状态
    var oldScale: Number = target.scaleX;
    //先算出元件原始大小时的newPose
    //var initPose:Point=new Point((newPose.x-target.x)/oldScale, (newPose.y-target.y)/oldScale);
    //发现用转换函数将元件所在场景的座标,转换为元件的内部座标,免去了上面的换算
    var initPose:Point= target.globalToLocal(target.parent.localToGlobal(newPose));
    TweenMax.to(target, .7, {
        scaleX: scale, scaleY: scale,
        x: target.x - (initPose.x*scale-initPose.x*oldScale),
        y: target.y - (initPose.y*scale-initPose.y*oldScale),
        ease: Cubic.easeOut
    });
}

/*
* 显示对象.globalToLocal(x, y) 将舞台座标转化为该显示对象内部本地座标 (常用)
* 显示对象.localToGlobal(x, y) 将本地座标转化为该现实对象所在舞台座标
*/

其实你要是不想伤脑筋去这么多计算座标,用TweenMax的一个方法也可以(TransformAroundPointPlugin.as是收费类插件):

TweenMax.to(img, 0.7, {transformAroundPoint:{point:new Point(img.parent.mouseX,img.parent.mouseY), scaleX:img.scaleX+=1, scaleY:img.scaleY+=1}});

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章