Last active
October 11, 2015 11:18
-
-
Save lynxerzhang/3850637 to your computer and use it in GitHub Desktop.
scale displayobject(等比例缩放偏移)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* @param resource | |
* align the specfied resource to top-left coordinate | |
*/ | |
function handleResetTopLeftPos(resource:Sprite):Sprite{ | |
var s:Sprite = new Sprite(); | |
resource.parent.addChildAt(s, resource.parent.getChildIndex(resource)); | |
s.addChild(resource.parent.removeChild(resource)); | |
var leftTop:Point = getLeftTopPosition(resource); | |
var originX:Number = resource.x; | |
var originY:Number = resource.y; | |
resource.x = leftTop.x; | |
resource.y = leftTop.y; | |
s.x = -leftTop.x + originX; | |
s.y = -leftTop.y + originY; | |
return s; | |
} | |
/** | |
* get the displayobject's topleft position | |
* | |
* @param d | |
* | |
* @return point | |
* | |
* @see DisplayObjectUtil.as | |
*/ | |
function getLeftTopPosition(d:DisplayObject, scaleX:Number = NaN, scaleY:Number = NaN):Point { | |
if(!isNaN(scaleX)){ | |
d.scaleX = scaleX; | |
} | |
if(!isNaN(scaleY)){ | |
d.scaleY = scaleY; | |
} | |
var rect:Rectangle = d.getBounds(d); | |
var m:Matrix = d.transform.matrix; | |
/** | |
* the displayobject's scaleX scaleY maybe have problem | |
*/ | |
var scaleX:Number = m.a; | |
var scaleY:Number = m.d; | |
var rx:Number, ry:Number; | |
rx = scaleX >0 ? m.a * rect.left : m.a * rect.right; | |
ry = scaleY >0 ? m.d * rect.top : m.d * rect.bottom; | |
return new Point(-rx|0, -ry|0); | |
} | |
var t:Sprite = handleResetTopLeftPos(_mc); | |
var time:Number; | |
var revert:Boolean = false; | |
//TODO | |
t.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent):void{ | |
if(!isComplete){ | |
return; | |
} | |
var content:Sprite = t.getChildAt(0) as Sprite; | |
var mt:Matrix = content.transform.matrix; | |
var prevMouseX:Number = content.mouseX; | |
var prevMouseY:Number = content.mouseY; | |
var leftTop:Point; | |
time = getTimer(); | |
revert = !revert; | |
var prevPoint:Point = new Point(prevMouseX, prevMouseY); | |
var currentPoint:Point = prevPoint.clone(); | |
prevPoint = content.localToGlobal(prevPoint); | |
isComplete = false; | |
easeing(mt, {"a":revert ? 1 : .2, "d": revert ? 1 : .2}, .2, Sine.easeOut, function():void{ | |
content.transform.matrix = mt; | |
//等比例缩放调整坐标TODO | |
leftTop = getLeftTopPosition(content); | |
content.x = leftTop.x; | |
content.y = leftTop.y; | |
currentPoint.x = prevMouseX; | |
currentPoint.y = prevMouseY; | |
currentPoint = content.localToGlobal(currentPoint); | |
t.x -= currentPoint.x - prevPoint.x; | |
t.y -= currentPoint.y - prevPoint.y; | |
}); | |
}); | |
addChild(t); | |
var sx:Number = (stage.stageWidth - t.width) * .5; | |
var sy:Number = (stage.stageHeight - t.height) * .5; | |
t.x = sx; | |
t.y = sy; | |
var isComplete:Boolean = true; | |
function easeing(t:Object, property:Object, duration:Number, easeFun:Function, updateFun:Function):void{ | |
var s:Shape = new Shape(); | |
var ns:Number, d:Number = 0; | |
var starts:Object = {}, changes:Object = {}; | |
for(var it:* in property){ | |
starts[it] = t[it]; | |
changes[it] = property[it] - t[it]; | |
} | |
s.addEventListener(Event.ENTER_FRAME, function(evt:Event):void{ | |
ns = (getTimer() - time) * .001; | |
d = ns >= duration ? 1 : easeFun(ns, 0, 1, duration); | |
for(var item:* in property){ | |
t[item] = starts[item] + changes[item] * d; | |
} | |
updateFun(); | |
if(d == 1){ | |
isComplete = true; | |
s.removeEventListener(Event.ENTER_FRAME, arguments.callee); | |
} | |
}); | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment