如果我有一個容器,有兒童在其中顯示對象。 容器的尺寸是由孩子的尺寸決定的。當尺寸變化時,我需要做一些事情來適應新的尺寸。如何檢測兒童大小更改動作?
因爲我沒有找到事件來檢測它,我使用ENTER_FRAME事件,這很愚蠢。 保留每個最後一幀的大小,並與當前幀進行比較。可能在處理輸入幀事件後更改大小,因此在某些情況下,您可能會在下一幀中看到正確的結果。
我不認爲這是一個很好的解決方案組件。給我你的想法,謝謝。
如果我有一個容器,有兒童在其中顯示對象。 容器的尺寸是由孩子的尺寸決定的。當尺寸變化時,我需要做一些事情來適應新的尺寸。如何檢測兒童大小更改動作?
因爲我沒有找到事件來檢測它,我使用ENTER_FRAME事件,這很愚蠢。 保留每個最後一幀的大小,並與當前幀進行比較。可能在處理輸入幀事件後更改大小,因此在某些情況下,您可能會在下一幀中看到正確的結果。
我不認爲這是一個很好的解決方案組件。給我你的想法,謝謝。
我會做的是無論函數調整孩子的大小,添加自己的調度事件,它會廣播發生了大小變化。
//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.
}
我假設一些代碼的東西,所以讓我知道如果這不完全適用於你。
那麼這裏沒有標準的解決方案。你可以創建一個自定義的類,它覆蓋了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上的幀發生了變化),但在大多數情況下,這將起作用。在調度調整大小之前,我在這些調試器中添加了額外的檢查。這取決於這種情況是否適合您的情況。
對象過度騎事對我來說太大膽了。這意味着您無法將flash.display.Sprite添加到我的組件,您必須添加xxx.MySprite,您無法添加flash.display.MovieClip,您必須添加xxx.MyMovieClip等,這實際上揭露了面向對象編程的弱點,不要忘記刪除子項和添加子項,這也會改變對象的大小。 – Max
是的,它是一個限制,你不能重寫使用組合。然而,爲什麼這會成爲你的問題?只是擴展和完成?對於其他組件,您可以選擇僅手動收集數據。 順便說一句,我想,如果你想使用組合,你也可以創建一個行爲類,使用getRect()或getBounds()每幀獲取矩形,並在差異調度調整大小(或做你的事情想做)。這可以提供更多的控制。 就像我說的這取決於案件。你想創造什麼? –
孩子們如何調整大小?你有我們可以看到的任何代碼嗎? – Duke
Event.RESIZE和每個孩子如何聽這個事件? –