2011-08-24 50 views
0

我与我放大闪光灯的图像混合。我有一切工作,只有我想要点击X和Y的协调中心到舞台。 (所以点击的区域总是放大并将区域定位到舞台中间) 图像是一个动画片段,它用一个补间进行放大,但我试过一切,但图像不会居中舞台。设置放大鼠标点击目标到舞台的中心

有没有人有一个线索,我可以用来做到这一点?

我的代码是:

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

回答

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不再给出的绝对距离的左上角之间的精确测量和鼠标点击。相反,您需要按比例缩放广场,因为这是准确的,这就是为什么我上面的建议应该起作用。

+0

好的,我试过这个,但是当注册点在左上方时,它启动了舞台中央的图像角落的动画,它仍然像以前一样放大,而没有移动它到中心。我需要以某种方式注册点击点并将这一点移到舞台中心?或?:)以及你建议的代码,是否应该放在“放大”功能中?我应该只是将其添加到原始代码中,还是删除其中的一部分?它不会工作:/ – Cat

+0

我的代码行将替换_syncScale()方法中的最后三个,保留scaleX/scaleY定义,但替换其余部分。 – richardolsson