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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值