打开这个百度MP3网站 http://mp3.baidu.com/ 下面可以看到一个flash相关的图片墙,这个图片墙能够显示歌手或者其他活动的信息,是一个实用的flash。flash显示了歌手的信息,当鼠标滚动的时候能够显示出相应的图片信息。
我们采用捕捉swf的软件,可以轻松下载这个flash,然后使用一下flash分解软件就能够看到内部相应的情况,但是一般来讲flash分解后能够正常显示是一个很不错的结果,不过大部分flash分解后的flash 源文件都很多错误,编译之后,依旧需要进行排错和纠正。
接下来就是进行排错了,破解出来的源码,变量名的显示都不是原本的含义,尽管有时候能够编译通,不过看起来十分吃力,违背了原来的含义。(变量名变化,颜色值会变化,参数会变化等等)
经过一些简单处理工作后,得到了下面的源码。这个源码值得学习的是数据的交互。本身的swf只是一个数据的容器,为了能够获取到数据,那么swf需要到浏览器里面进行获取数据。
关于这个flash 是如何获取数据? 其实这个分解后的flash是采用js结合方式返回一个xml数据的,不需要额外建一个xml的数据文件,大大方便了数据读取。
flash----->js ,flash获取js返回的xml数据。
破解后的flash 主要有两个类,一个是PhotoItem.as(用于显示图片) ,另外一个是PhotoWall.as 文件(主文件),其他的是缓冲的类,借助两个类就实现这种图片墙的效果。
好,现在粘贴经过改过后的flash类库可以运行。有兴趣可以尝试这种分解玩意,过程非常有趣。可以学习一下数据交互。
当中import laan.smart.tween.* 这个类库可以采用Tweener类来替代。
package { import flash.events.*; import flash.display.*; import flash.text.*; import laan.smart.tween.*; import flash.external.*; import flash.geom.*; import flash.filters.*; import flash.net.*; public class PhotoItem extends Sprite { private var border:Sprite; private var _imageURL:String; private var detail:Sprite; private var _index:uint; private var _link:String; private var image:Loader; private var detailText:TextField; public function PhotoItem(index:uint) { var matrix:Matrix; var array:Array; super(); this._index=index; this.image=new Loader(); this.image.mouseEnabled=false; this.image.mouseChildren=false; this.image.contentLoaderInfo.addEventListener(Event.COMPLETE,this.loaderEventsHandler); this.image.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,this.loaderEventsHandler); this.image.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR,this.loaderEventsHandler); this.image.alpha=0.8; addChild(this.image); this.border=new Sprite ; this.border.mouseEnabled=false; matrix=new Matrix(); matrix.createGradientBox(100,100,Math.PI / 2); array=index < 9?[5996250,2837153]:[10116316,7744417]; this.border.graphics.beginGradientFill(GradientType.LINEAR, array, [1, 1], [0, 0xFF], matrix); this.border.graphics.drawRect(0,0,100,100); this.border.graphics.drawRect(4,4,92,92); this.border.graphics.endFill(); this.border.visible=false; this.border.alpha=1; addChild(this.border); this.detail=new Sprite(); this.detail.mouseEnabled=false; this.detail.mouseChildren=false; matrix=new Matrix(); matrix.createGradientBox(160,100,Math.PI / 2); array=index < 9?[5996250,2837153]:[10116316,7744417]; this.detail.graphics.beginGradientFill(GradientType.LINEAR, array, [1, 1], [0, 0xFF], matrix); this.detail.graphics.drawRect(0,0,160,100); this.detail.graphics.endFill(); this.detail.visible=false; addChild(this.detail); this.detailText=new TextField(); this.detailText.textColor=0xFFFFFF; this.detailText.x=this.detailText.y=5; this.detailText.width=this.detail.width - 10; this.detailText.height=this.detail.height - 10; this.detailText.multiline=true; this.detailText.wordWrap=true; this.detailText.filters=[new DropShadowFilter(0,0,0,0)]; this.detail.addChild(this.detailText); var rect:Sprite=new Sprite(); rect.graphics.beginFill(0xFF0000,0); rect.graphics.drawRect(0,0,100,100); rect.buttonMode=true; addChild(rect); rect.addEventListener(MouseEvent.MOUSE_OVER,this.mouseEventsHandler); rect.addEventListener(MouseEvent.MOUSE_OUT,this.mouseEventsHandler); rect.addEventListener(MouseEvent.CLICK,this.mouseEventsHandler); } //设置文本框提示信息 public function setDetailText(title:String,content:String):void { this.detailText.htmlText="" + title + "
" + content; } private function loaderEventsHandler(event:Event):void { if (event.type == Event.COMPLETE) { this.image.width=this.image.height=100; } } //加载图片的链接 public function set imageURL(url:String):void { if (this._imageURL != url) { this._imageURL=url; this.image.load(new URLRequest(this._imageURL)); } } //鼠标事件处理 private function mouseEventsHandler(event:MouseEvent):void { //var event:* =event; switch (event.type) { case MouseEvent.MOUSE_OVER : this.image.alpha=1; if (this.detailText.text) { this.border.visible=true; parent.setChildIndex(this,parent.numChildren - 1); this.detail.x=this.image.x + 100; if (stage.stageWidth < x + this.detail.x + this.detail.width) { this.detail.x=this.image.x - this.detail.width; } this.detail.visible=true; this.detail.alpha=0; Tweener.addTween(this.detail,0.2,{alpha:1,delay:0.5}); } break; case MouseEvent.MOUSE_OUT : this.image.alpha=0.8; this.border.visible=false; Tweener.removeAllTween(false); this.detail.visible=false; break; case MouseEvent.CLICK : try { ExternalInterface.call("onItemClick",this._index); if (ExternalInterface.objectID) { ExternalInterface.call("window.open",this._link); return; } } catch (e:Error) { } navigateToURL(new URLRequest(this._link),"_blank"); break; } } //链接 public function set link(link:String):void { this._link=link; } }}//package
package { import flash.events.*; import flash.display.*; import flash.external.*; public class PhotoWall extends Sprite { public function PhotoWall() { stage.scaleMode=StageScaleMode.EXACT_FIT; addEventListener(Event.ENTER_FRAME,this.enterFrameHandler); } //分析数据 private function analyseData(data:String):void { var xml:XML =null; var index:int =0; var list:* =null; var item:PhotoItem =null; var value:* =data; try { xml=new XML(value); index=0; for each (list in xml.list) { //图片进行矩阵分布 item=new PhotoItem(index); item.x=index % 9 * 100 + 2; item.y=uint(index / 9) * 100 + 2; item.link=String(list.@u);//点击图片超链接 item.imageURL=String(list.@p);//图片图片墙 if (index % 9 != 8) { item.setDetailText(String(list.id),String(list.c));//对图片描述 } addChild(item); index=index + 1; } } catch (e:Error) { } } private function enterFrameHandler(event:Event):void { var data:String; if (ExternalInterface.available) { data=ExternalInterface.call("getPhotoWallData"); if (data) { this.analyseData(data); removeEventListener(Event.ENTER_FRAME,this.enterFrameHandler); } } else { removeEventListener(Event.ENTER_FRAME,this.enterFrameHandler); } } }}//package
使用这个类 还不行的,因为要获取到网页当中的js 返回的xml 数据,所以我们通过查看网页的js文件可以发现到数据的来源。
data=ExternalInterface.call("getPhotoWallData"); 通过这个函数返回字符串信息内容,这样经过分析后,内容就能够正常显示了。
不妨试试玩一下。
最后,把编译出来的swf 和html放在一起,为了能够显示信息,顺便查看百度网页的里面的js文件,把js文件添加到生成的html文件当中,这样就能够显示图片的信息了 。
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow