正確訪問SWFLoader下載完了的元素屬性
flex裏有個SWFLoader,真是方便羣衆啊,不過在下載完了後,處理時有個注意點
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
private function handlePicture(evt:Event):void
{
try
{
var img:Image = Image(evt.target);
var s:String = ">>image: " + img + '/n';
s += "/twidth: " + img.width + '/n';
s += "/theight: " + img.height + '/n';
s += "/tcontent: " + img.content + '/n';
s += "/tcontentWidth: " + img.contentWidth + '/n'
s += "/tcontentHeight: " + img.contentHeight + '/n';
Alert.show(s);
}
catch(e:Error)
{
Alert.show(e.toString());
}
}
]]>
</mx:Script>
<mx:Image id="my_image" source="test.jpg" complete="handlePicture(event);" />
</mx:Application>
以上代碼非常簡單,Image是繼承SWFLoader的,針對圖像,在這裏和SWFLoader是一樣的.
注意廣播事件,用的是complete.熟悉的人應該知道complete和init的差異.
下載內容是圖片的話,complete和init是沒啥區別的.
好了,那麼有什麼要注意的麼?
如果copy上面程序,編譯運行一下的話,就會看到,img的width和height是0,而contentWidth和contentHeight是有值的.
這是因爲contentWidth和contentHeight,顧名思義,就是content.width和content.height,而content指的是下載好了的Bitmap對象,當然它的屬性是有值的.
而SWFLoader,在下載好後,因爲要進行整個樣式,尺寸等方面的改變,所以使用了一系列invalidate,而這些是基於callLater的.
關於callLater,可以簡單的認爲是,把現有要執行的代碼,在這一幀的最後執行.
詳細的看這裏
所以如果在下載完了,馬上去訪問img的width和height,取到的是不正確的
contentWidth和contentHeight這兩個屬性在手冊上是有提起的.
可以看這裏
瞭解了這點就可以繼續工作了,如果非要等img也完全賦值了才進行,可以通過下面這個比較bt的方法
<mx:Image id="my_image" source="test.jpg" complete="callLater(callLater, [handlePicture,[event]]);" />
呵呵,通過兩個callLater,把handlePicture放到比invalidate還後面執行,這樣就可以了
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
private function handlePicture(evt:Event):void
{
try
{
var img:Image = Image(evt.target);
var s:String = ">>image: " + img + '/n';
s += "/twidth: " + img.width + '/n';
s += "/theight: " + img.height + '/n';
s += "/tcontent: " + img.content + '/n';
s += "/tcontentWidth: " + img.contentWidth + '/n'
s += "/tcontentHeight: " + img.contentHeight + '/n';
Alert.show(s);
}
catch(e:Error)
{
Alert.show(e.toString());
}
}
]]>
</mx:Script>
<mx:Image id="my_image" source="test.jpg" complete="handlePicture(event);" />
</mx:Application>
以上代碼非常簡單,Image是繼承SWFLoader的,針對圖像,在這裏和SWFLoader是一樣的.
注意廣播事件,用的是complete.熟悉的人應該知道complete和init的差異.
下載內容是圖片的話,complete和init是沒啥區別的.
好了,那麼有什麼要注意的麼?
如果copy上面程序,編譯運行一下的話,就會看到,img的width和height是0,而contentWidth和contentHeight是有值的.
這是因爲contentWidth和contentHeight,顧名思義,就是content.width和content.height,而content指的是下載好了的Bitmap對象,當然它的屬性是有值的.
而SWFLoader,在下載好後,因爲要進行整個樣式,尺寸等方面的改變,所以使用了一系列invalidate,而這些是基於callLater的.
關於callLater,可以簡單的認爲是,把現有要執行的代碼,在這一幀的最後執行.
詳細的看這裏
所以如果在下載完了,馬上去訪問img的width和height,取到的是不正確的
contentWidth和contentHeight這兩個屬性在手冊上是有提起的.
可以看這裏
瞭解了這點就可以繼續工作了,如果非要等img也完全賦值了才進行,可以通過下面這個比較bt的方法
<mx:Image id="my_image" source="test.jpg" complete="callLater(callLater, [handlePicture,[event]]);" />
呵呵,通過兩個callLater,把handlePicture放到比invalidate還後面執行,這樣就可以了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.