Skip to content

Instantly share code, notes, and snippets.

@lynxerzhang
Last active October 11, 2015 11:18
Show Gist options
  • Save lynxerzhang/3850637 to your computer and use it in GitHub Desktop.
Save lynxerzhang/3850637 to your computer and use it in GitHub Desktop.
scale displayobject(等比例缩放偏移)
/**
* @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