1,由于FLEX图片有跨域问题。所以我采用LORDER先把图片加载到内存中的bitmapdata对象,再对它操作,这样可发避免跨域问题。但由于网络环境问题,其实这是个异步的操作,即只须加载完成,才对它处理。那么怎么做个异步WAIT呢,用事件触发。
代码如下。
///这是个为避免跨域问题加载图片的类。
package components
{
import event.IEvent;
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.display.Loader;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.net.URLRequest;
import flash.system.LoaderContext;
import mx.controls.Alert;
import mx.core.UIComponent;
///要使一个类,有分派事件的能力,要 extends EventDispatcher
public class LoadPics extends EventDispatcher
{
private var lc:LoaderContext = new LoaderContext();
private var loader:Loader = new Loader();
private var bitmapdata:BitmapData;
public function LoadPics(imgUrls:String)
{
//注册加载完成后处理事件。。
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadImage_over);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, failure_over);
loader.load(new URLRequest(imgUrls), lc);
};
/***
*
* 加载完成,把图片信息放入到内存bitmapdata对象。。
* 触发事件。让上层做具体的业务处理。。
* ***/
private function loadImage_over(e:Event):void {
var bitmap:DisplayObject;
try {
bitmap= loader.content;
} catch (err:SecurityError) {
loader.loadBytes(loader.contentLoaderInfo.bytes);//有沙箱问题就转化为二进制数据再次载入
return;
}
bitmapdata= new BitmapData(bitmap.width, bitmap.height);
bitmapdata.draw(bitmap);
//IEvent 你自己定义的事件。一般要EXTENDS EVENT
dispatchEvent(new IEvent());
};
public function getBitmapdata():BitmapData{
return this.bitmapdata;
}
private function failure_over(e:IOErrorEvent):void {
Alert.show("加载图片出错:"+e.text);
};
}
}
在MXML中你可以。作如下调用
/***
* 抓取原图片。
* **/
protected function button1_clickHandler(event:MouseEvent):void
{
///imgUrl.text image url
ldp=new LoadPics(imgUrl.text);
//捕获下层的图片加载完成,并已放入内存的事件信息。
//进入showImage方法作出业务处理
ldp.addEventListener(IEvent.EventName,showImage);
}
/***
* 处理图片
* 这里只是显示
* ***/
protected function showImage(event:IEvent):void{
///这时对 srcImg.source或者ldp.getBitmapdata()的操作就不存在跨域问题了
srcImg.source=ldp.getBitmapdata();
}