as3改变元件注册点

flash和Scaleform中,对显示对象的形变:旋转、缩放都是以注册点为参考点的,如果注册点位置不正确,就无法得到想要的效果。所以,有时候,我们可能会需要在as3中动态的修改元件如影片剪辑的注册点。


首先,注册点位置是不可变的,固定为(0,0)。改变注册点是如此基本的东西,或许你认为 ActionScript语言内建了解决方案,但事实上没有(我当初也是这么认为的。。)。话虽如此,网上已经有很多大神完成这项操作,不过比较复杂。我这里找到另一个比较简单的方法。


核心思路是:既然不能移动注册点,我们可以绕过这个问题,没必要死磕。就是移动所有元件本身,而不是移动注册点。因为,位置是相对的,所以元件本身以及子对象移动了,那么它们相对于其注册点的相对位置就改变了,相应的相关的形变操作的参考点也改变了。下面提供一个函数来实现该操作。


//change DisplayObject's reg:修改展示对象movieclip等的注册点位置
public static function SetRegPoint(obj:DisplayObjectContainer, newX:Number, newY:Number):void { 
if(obj.parent==null){
return;
}
var bounds:Rectangle = obj.getBounds(obj.parent); 
var currentRegX:Number = obj.x - bounds.left; 
var currentRegY:Number = obj.y - bounds.top; 

var xOffset:Number = newX - currentRegX; 
var yOffset:Number = newY - currentRegY; 
obj.x += xOffset; 
obj.y += yOffset; 

for(var i:int = 0; i < obj.numChildren; i++) { 
obj.getChildAt(i).x -= xOffset; 
obj.getChildAt(i).y -= yOffset; 



这个函数很容易使用。第一个参数是你要影响的对象,该对象必须是一个显示对 象容器(DisplayObjectContainer),所以它可以是Sprite、MovieClip,甚至Loader实例。第二个和第三个参数就 是你想要的新注册点的x和y值——相对于剪辑图形内容的左上角。而且,就像我所说的,代码工作时忽略注册点现在在哪里。

getBounds() 函数用来获取剪辑的边界框。剪辑的x和y属性给出了当前注册点的位置。暂时让我们只考虑x方向:bounds.left值是图形内容的最左边的位置,剪辑 的x属性给出了注册点的x位置。这两个值都来自父视图(坐标空间),这两个数之间的差异给出了注册点相对图形内容最左边的当前位置,然后从我们要使用的新 x值中扣除该(差)值,存储在变量xOffset中。剩下的部分是将所有的子对象向左移动这个数值,最后再讲剪辑自身向右移动这个数值。在y方向上保持同 样的处理。


调用该函数修改中心点位置

setRegPoint(mc, mc.width / 2, mc.height / 2); 



你可能感兴趣的:(flash,as3)