设置缩放鼠标单击目标到舞台中心

时间:2011-08-24 08:32:10

标签: actionscript-3

我正在拍摄一张我在闪光灯中放大的图像。我得到了一切工作,只有我希望点击的X和Y协调中心到舞台。 (以便点击的区域始终放大并将点击的区域定位到舞台的中间) 图像是一个动画片段,它用补间缩放,但我尝试了一切,但图像不会在舞台中心..

有没有人知道我可以使用哪些动作脚本3代码?

我的代码是:

const TWEEN_IN:String = "tweenIn";
const TWEEN_OUT:String = "tweenOut";
var tweenDirection:String;

var internalPoint:Point;
var externalPoint:Point;
var tw:Tween;

square.x = stage.stageWidth - square.width/2;
square.y = stage.stageHeight - square.height/2;

square.addEventListener(MouseEvent.CLICK, zoomIn);

function zoomIn($e:MouseEvent):void
{
    square.removeEventListener(MouseEvent.CLICK, zoomIn);
    //internalPoint = new Point(stage.width/2, stage.height/2);
    internalPoint = new Point(square.mouseX, square.mouseY);
    //externalPoint = new Point(500, 350);
    externalPoint = new Point(stage.mouseX, stage.mouseY);
    tweenDirection = TWEEN_IN;
    tw = new Tween(null, "", Strong.easeOut, square.scaleX, 3, 1, true);
    tw.addEventListener(TweenEvent.MOTION_CHANGE, _syncScale);
    tw.addEventListener(TweenEvent.MOTION_FINISH, _cleanTween);
}

function _syncScale($e:TweenEvent):void
{
    square.scaleX = square.scaleY = tw.position;
    var matrix:Matrix = square.transform.matrix;
    MatrixTransformer.matchInternalPointWithExternal(matrix, internalPoint, externalPoint);
    square.transform.matrix = matrix;
}

function _cleanTween($e:TweenEvent):void
{
    tw.removeEventListener(TweenEvent.MOTION_CHANGE, _syncScale);
    tw.removeEventListener(TweenEvent.MOTION_FINISH, _cleanTween);
    tw = null;
    if(tweenDirection == TWEEN_IN)
    stage.addEventListener(MouseEvent.CLICK, zoomOut);
    else if(tweenDirection == TWEEN_OUT)
    square.addEventListener(MouseEvent.CLICK, zoomIn);
}

function zoomOut($e:MouseEvent):void
{
    stage.removeEventListener(MouseEvent.CLICK, zoomOut);
    //internalPoint = new Point(0, 0);
    //externalPoint = new Point(0, 0);
    externalPoint = square.localToGlobal(internalPoint);
    internalPoint = square.globalToLocal(externalPoint);
    tweenDirection = TWEEN_OUT;
    tw = new Tween(null, "", Strong.easeOut, square.scaleX, 1, 1, true);
    tw.addEventListener(TweenEvent.MOTION_CHANGE, _syncScale);
    tw.addEventListener(TweenEvent.MOTION_FINISH, _cleanTween);
}

1 个答案:

答案 0 :(得分:0)

只需在放大时执行此操作:

square.x = externalPoint.x - (internalPoint.x * square.scaleX);
square.y = externalPoint.y - (internalPoint.y * square.scaleY);

这假设正方形在左上角有原点/注册点,并通过记录注册点和点击(internalPoint)之间的距离,然后确保保持相同的距离,尽管是缩放的,在比例完成后。

以另一种方式解释,它将点击的中心存储在internalPoint(与广场的左上角相关),以及externalPoint中相同点的舞台位置(其中是绝对的)。这意味着你要立即(在缩放之前)执行以下操作,它将没有任何效果:

square.x = externalPoint.x - internalPoint.x;

然而,在比例尺之后,internalPoint不再能准确测量左上角和鼠标点击之间的绝对距离。相反,你需要将其缩放到与方形缩放相同的数量,以确保准确,这就是为什么我的建议应该有效。