flash 和flex中的所有可视对象的注册点全部都是默认在(0,0)点,也就是左上角.在flash内编辑状态下 可以调整注册点位置 但要是程序生成的就没有办法了 因为还没发现有注册点属性.只操作位置 x,y时注册点在什么位置并不重要 但要是操作旋转rotation 缩放scaleX,scaleY 注册点在上面总感觉别扭,习惯上的位置应该是几何中心.
调整方法(一):双层容器嵌套;
这中方法就是 用两层容器包裹起对象 内层容器的几何中心放在外层的注册点位置 也就是说内层的xy位width/2,height/2.这样一来就技巧的实现了对外层的操作转化成了内层几何中心的操作.
调整方法(二)动态调整坐标
其实注册点的不同,产生的效果就是操作或的位置不同.那么根据不同的操作和注册点的偏差,进行调整也能实现对注册点的改变,而且这种方式更直接和方便.自己看类的结构就明白了.
package com.makyoo.geometry
{
//www.makyoo.cn QQ:84407979
//动态改变注册点类
import flash.display.DisplayObject;
import flash.geom.Point;
//动态设置注册点
public class DynamicRegistration
{
//需更改的注册点位置
private var regpoint:Point
//更改注册的显示对象
private var target:DisplayObject
private var Height:Number
private var Width:Number
//首先要确定初始状态
public function DynamicRegistration(target:DisplayObject,regpoint:Point,iWidth:Number=320,iHeight:Number=240)
{
Width=iWidth
Height=iHeight
this.target=target
this.regpoint=regpoint
}
//设置显示对象的属性
public function flush(prop:String,value:Number):void
{
var mc=this.target
//转换为全局坐标
var A:Point=mc.parent.globalToLocal(mc.localToGlobal(regpoint))
if(prop=="x"||prop=="y")
{
mc[prop]=value-regpoint[prop]
}else if(prop=="scaleX" || prop=="scaleY")
{
if(mc[prop]>value){
//放大过程
mc.x+=((Width*(value+0.1))-(Width*value))/4
mc.y+=((Height*(value+0.1))-(Height*value))/4
}else{
//缩小过程
mc.x-=((Width*value)-(Width*(value-0.1)))/4
mc.y-=((Height*value)-(Height*(value-0.1)))/4
}
mc[prop]=value
}
else
{
mc[prop]=value
//执行旋转等属性后,再重新计算全局坐标
var B:Point=mc.parent.globalToLocal(mc.localToGlobal(regpoint))
//把注册点从B点移到A点
mc.x+=A.x-B.x
mc.y+=A.y-B.y
}
}
}
}
转自: http://www.makyoo.cn/article/ActionScript3/16.htm