以元件自身座標系縮放:
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}});