2012-10-16 61 views
0

如果我有一個容器,有兒童在其中顯示對象。 容器的尺寸是由孩子的尺寸決定的。當尺寸變化時,我需要做一些事情來適應新的尺寸。如何檢測兒童大小更改動作?

因爲我沒有找到事件來檢測它,我使用ENTER_FRAME事件,這很愚蠢。 保留每個最後一幀的大小,並與當前幀進行比較。可能在處理輸入幀事件後更改大小,因此在某些情況下,您可能會在下一幀中看到正確的結果。

我不認爲這是一個很好的解決方案組件。給我你的想法,謝謝。

+0

孩子們如何調整大小?你有我們可以看到的任何代碼嗎? – Duke

+0

Event.RESIZE和每個孩子如何聽這個事件? –

回答

0

我會做的是無論函數調整孩子的大小,添加自己的調度事件,它會廣播發生了大小變化。

//Never forget to import your classes. 
import flash.events.EventDispatcher; 
import flash.events.Event; 

//Our custom listener listens for our custom event, then calls the function we 
//want called when children are resized. 
addEventListener("childResized", honeyIResizedTheChildren); 

function resizingLikeFun(){ 
    datClip.width++;//they be resizin, yo. 
    dispatchEvent(new Event("childResized"));//Our custom event 
} 

function honeyIResizedTheChildren(e:Event){ 
    trace("Giant Cheerios"); 
    //Whatever you want to do when the children are resized goes here. 
} 

我假設一些代碼的東西,所以讓我知道如果這不完全適用於你。

+0

對不起哥們,如果我知道如何以及何時調整大小,這不會是一個問題。例如,datClip.width ++並不意味着對象的寬度確實會增加一個。因爲您不知道對象的類型它是。 – Max

+1

@Duke - 應避免在事件中使用字符串,創建一個包含事件類型的Events類,例如。 Events.ChildResized,用事件代替任何名字是合適的 – Neil

+0

@Neil謝謝你的提示!我也意識到我的腳本比無用的更糟糕,因爲調用函數會做同樣的事情並做得更好。我早該看到了,爲此我表示歉意。 – Duke

2

那麼這裏沒有標準的解決方案。你可以創建一個自定義的類,它覆蓋了width/height/x/y/scaleX/scaleY/scrollRect的設置器,也許還有其他一些屬性。孩子們應該擴大這樣一個班級。

我使用了一個布爾值來防止它被調度多次,在一個幀後標誌將被重置。

override public function set width(value:Number):void 
{ 
    if (value !== super.width && !isNaN(Number(value)) this.dispatchResize(); 
    super.width = value; 
} 

override public function set height(value:Number):void 
{ 
    if (value !== super.height && !isNaN(Number(value)) this.dispatchResize(); 
    super.height = value; 
} 

override public function set scaleX(value:Number):void 
{ 
    if (value !== super.scaleX && !isNaN(Number(value)) this.dispatchResize(); 
    super.scaleX = value; 
} 

override public function set scaleY(value:Number):void 
{ 
    if (value !== super.scaleY && !isNaN(Number(value)) this.dispatchResize(); 
    super.scaleY = value; 
} 

private var _hasDispatchedResize:Boolean; 
protected function dispatchResize():void 
{ 
    // do something 
    if (!this._hasDispatchedResize) 
    { 
     this.dispatchEvent(new Event(Event.RESIZE)); 
     this._hasDispatchedResize = true; 
     this.addEventListener(Event.ENTER_FRAME, handleEnterFrameOnce); 
    } 
} 

private function handleEnterFrameOnce(event:Event):void 
{ 
    this.removeEventListener(Event.ENTER_FRAME, handleEnterFrameOnce); 
    this._hasDispatchedResize = false; 
} 

現在,在容器類中,您可以收聽兒童的Event.RESIZE。您不確定該值是否真的發生了變化(如果MovieClip上的幀發生了變化),但在大多數情況下,這將起作用。在調度調整大小之前,我在這些調試器中添加了額外的檢查。這取決於這種情況是否適合您的情況。

+0

對象過度騎事對我來說太大膽了。這意味着您無法將flash.display.Sprite添加到我的組件,您必須添加xxx.MySprite,您無法添加flash.display.MovieClip,您必須添加xxx.MyMovieClip等,這實際上揭露了面向對象編程的弱點,不要忘記刪除子項和添加子項,這也會改變對象的大小。 – Max

+0

是的,它是一個限制,你不能重寫使用組合。然而,爲什麼這會成爲你的問題?只是擴展和完成?對於其他組件,您可以選擇僅手動收集數據。 順便說一句,我想,如果你想使用組合,你也可以創建一個行爲類,使用getRect()或getBounds()每幀獲取矩形,並在差異調度調整大小(或做你的事情想做)。這可以提供更多的控制。 就像我說的這取決於案件。你想創造什麼? –