flash和scaleform中,對顯示物件的形變:旋轉、縮放都是以註冊點為參考點的,如果註冊點位置不正確,就無法得到想要的效果。所以,有時候,我們可能會需要在as3中動態的修改元件如影片剪輯的註冊點。
首先,註冊點位置是不可變的,固定為(0,0)。改變註冊點是如此基本的東西,或許你認為 actionscript語言內建了解決方案,但事實上沒有(我當初也是這麼認為的。。)。話雖如此,網上已經有很多大神完成這項操作,不過比較複雜。我這裡找到另乙個比較簡單的方法。
核心思路是:既然不能移動註冊點,我們可以繞過這個問題,沒必要死磕。就是移動所有元件本身,而不是移動註冊點。因為,位置是相對的,所以元件本身以及子物件移動了,那麼它們相對於其註冊點的相對位置就改變了,相應的相關的形變操作的參考點也改變了。下面提供乙個函式來實現該操作。
//change displayobject's reg:修改展示物件movieclip等的註冊點位置
public static function setregpoint(obj:displayobjectcontainer, newx:number, newy:number):void
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++) }
這個函式很容易使用。第乙個引數是你要影響的物件,該物件必須是乙個顯示對 象容器(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);
as3 動態修改註冊點
package 設定顯示物件的屬性 public function flush prop string,value number void else 使用方法 import dynamicregistration var reg dynamicregistration new dynamicregi...
flash動態改變註冊點
這是乙個動態改變註冊點的類package 設定顯示物件的屬性 public function flush prop string,value number void else if prop scalex prop scaley else mc prop value else 用法如下 在舞台上放個...
AS改變「註冊點」的方法
as在flash8以後的版本中可以改變顯示元素的註冊點。在flash8環境下,顯示元素特指movieclip。這是因為api中提供了transform和matrix。利用這兩個類可以幾乎任意的操作顯示元素的形狀。以往的變形操作中,註冊點的概念僅在旋轉,縮放中有意義,平移不會影響註冊點。這樣,如果把註...