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

 

要实现WPF缩放时不改变控件在画布中心位置的效果,可以尝试以下步骤: 1. 将控件放置在一个Canvas控件中,并设置Canvas.Left和Canvas.Top属性,将控件放置在画布中心。 2. 将Canvas控件放置在一个Grid控件中,并将该Grid控件放置在Window中。 3. 在Window的Loaded事件中,通过VisualTreeHelper.GetChild方法获取Canvas控件,并获取其RenderTransform属性。 4. 创建一个ScaleTransform对象,并将其应用于Canvas控件的RenderTransform属性中。 5. 在ScaleTransform对象中设置CenterX和CenterY属性,使其缩放时围绕画布中心进行缩放。 下面是一个示例代码: ```xml <Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded"> <Grid> <Canvas Width="200" Height="200" Background="LightGray" Left="300" Top="125" RenderTransformOrigin="0.5,0.5"> <Ellipse Width="100" Height="100" Fill="Red"/> </Canvas> </Grid> </Window> ``` ```csharp private void Window_Loaded(object sender, RoutedEventArgs e) { var canvas = VisualTreeHelper.GetChild(this.grid, 0) as Canvas; var transform = new ScaleTransform(); canvas.RenderTransform = transform; transform.CenterX = canvas.Width / 2; transform.CenterY = canvas.Height / 2; } ``` 在上面的示例中,我们将Canvas控件放置在Grid控件中,并将其放置在Window中。在Window的Loaded事件中,我们获取了Canvas控件,并创建了一个ScaleTransform对象,将其应用于Canvas控件的RenderTransform属性中。然后,我们设置了ScaleTransform对象的CenterX和CenterY属性,使其缩放时围绕画布中心进行缩放
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值