以上兩種詭異特性
對於需要做物件縮放排版的功能時,很容易產生潛在的 Bug
尤其是需要開發或是修改 Flex UI Component 時
就算知道了,對於需要時間反映在物件尺寸特性
還是很難避免
難道每次修改過 scrollRect 之後,都要使用 setTimeout or callLater 嗎?
以下分享一個小技巧
可以讓你在變動過 scrollRect 之後,立即強迫 DisplayObject 更新尺寸相關屬性
AS3 示範程式:
/*
Ticore's Blog
http://ticore.blogspot.com
*/
package {
import flash.display.*;
import flash.geom.*;
import flash.utils.*;
public class Main extends MovieClip {
var mc:MovieClip;
public function Main() {
doTest();
}
public function doTest() {
mc = new MovieClip();
this.addChild(mc);
var g:Graphics = mc.graphics;
g.beginFill(0xFF0000);
g.drawRect(0, 0, 100, 100);
g.endFill();
traceSize("After draw rectangle graphic", mc);
mc.scrollRect = new Rectangle(0, 0, 50, 50);
traceSize("After assign scrollRect", mc);
//*/
// Force DisplayObject update dimensions
var bmpData:BitmapData = new BitmapData(1, 1);
bmpData.draw(mc);
traceSize("After draw by BitmapData", mc);
//*/
setTimeout(traceSize, 0, "0 ms later", mc);
setTimeout(traceSize, 10, "10 ms later", mc);
setTimeout(traceSize, 500, "500 ms later", mc);
}
public function traceSize(msg:String, target:DisplayObject):void{
trace("----------------------------------------------------");
trace(msg, ", time:" + getTimer());
trace("width:", mc.width, ", height:", mc.height,
", bounds:", mc.getBounds(mc.parent));
}
}
}
輸出結果:
----------------------------------------------------
After draw rectangle graphic , time:7
width: 100 , height: 100 , bounds: (x=0, y=0, w=100, h=100)
----------------------------------------------------
After assign scrollRect , time:13
width: 100 , height: 100 , bounds: (x=0, y=0, w=100, h=100)
----------------------------------------------------
After draw by BitmapData , time:45
width: 50 , height: 50 , bounds: (x=0, y=0, w=50, h=50)
----------------------------------------------------
0 ms later , time:85
width: 50 , height: 50 , bounds: (x=0, y=0, w=50, h=50)
----------------------------------------------------
10 ms later , time:92
width: 50 , height: 50 , bounds: (x=0, y=0, w=50, h=50)
----------------------------------------------------
500 ms later , time:571
width: 50 , height: 50 , bounds: (x=0, y=0, w=50, h=50)
相關連結:
AS - scrollRect 與 Mask 差異
What you should know about DisplayObject’s mask and scrollRect