前几天看到有园友写了一篇“ flash查看对方qq是否在线 ”,正好今天有一个朋友搞flash全站,想使用这个功能,但是有些小要求,点击图标后,要求弹出QQ对话框,于是改进了一下:
package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.globalization.StringTools; import flash.net.URLRequest; import flash.net.navigateToURL; import flash.display.Bitmap; import flash.display.Loader; import flash.ui.Mouse; import flash.ui.MouseCursor; public class Main extends Sprite { private var qq:String = "278919507"; private var loader:Loader = new Loader(); private var bit:Bitmap ; private var box:Sprite; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); box = new Sprite(); upData(); } public function upData():void { loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCom); var sUrl:String = "http://wpa.qq.com/pa?p=2:" + qq + ":41?" + Math.random(); trace(sUrl); loader.load(new URLRequest(sUrl)); } private function onCom(e:Event) :void { bit = Bitmap(loader.content); bit.height = 22; bit.width = 74; box.addChild(bit); addChild(box); box.x = box.y = 10; //点击图标,以及切换鼠标 box.addEventListener(MouseEvent.CLICK, onClick); box.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver); box.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut); } private function onClick(e:MouseEvent):void { var sUrl:String = "http://wpa.qq.com/msgrd?v=3&uin=" + qq + "&site=qq&menu=yes"; navigateToURL(new URLRequest(sUrl),"_blank"); trace("test"); } private function onMouseOver(e:MouseEvent):void { Mouse.cursor=MouseCursor.BUTTON; } private function onMouseOut(e:MouseEvent):void { Mouse.cursor=MouseCursor.ARROW; } } }
在flash cs5环境下一切正常,但是单独运行swf时会失败:并不能加载图片。原因是wpa.qq.com下没有策略文件,默认的安全沙箱保护机制并不允许跨域加载图片。
于是用aspx做了个中转,在自已的服务器上先把qq的图标下载到服务器,然后as3再去请求自己的服务器上的图片,因为自己的服务器能完全控制(包括放置策略文件),所以能解决安全沙箱的问题。