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}});

 

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