サムネイルにマウスオーバーしたときに、情報ウィンドウを表示するようにした。
また、サムネイルをクリックしたとき、または、情報ウィンドウ内のタイトルをクリックしたとき、または、「今すぐ買う」ボタンをクリックしたときに、アマゾンの詳細情報ウィンドウを開くようにした。
これらの処理はInfoWindowManagerというクラスで処理している。
タグで初期化しているが、ただのActionScriptだけのクラスになっている。
これは表示機能をまったく持っていないので、MVCのCらしいクラス。
Applicationタグ内は以下のような感じになった。
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" backgroundColor="0xFFFFFF" xmlns:v="customcomponent.*" applicationComplete="init()"> <mx:Script> <![CDATA[ namespace amecs = "http://webservices.amazon.com/AWSECommerceService/2008-08-19"; use namespace amecs; import jp.co.example.amazon.*; import jp.co.example.core.data.*; import jp.co.example.core.event.*; import jp.co.example.core.load.*; import customcomponent.*; private var urlmanager:URLManager=new URLManager(); private var xmlloader:XMLLoader=new XMLLoader(); private var xmldatamanager:XMLDataManager=new XMLDataManager(); private function init():void{ lotatecontroler.addEventListener(Controler.LOTATE_IMAGES,hboximages.startLotate); hboximages.addEventListener(InfoWindowManager.CALL_OPEN_WINDOW,infowindowmanager.callOpenWindow); hboximages.addEventListener(InfoWindowManager.CALL_CLOSE_WINDOW,infowindowmanager.callCloseWindow); hboximages.addEventListener(InfoWindowManager.CALL_DETAIL_URL,infowindowmanager.goToDetail); urlmanager.init(); loadXML(); } private function loadXML():void{ var urlstr:String=urlmanager.makeURLStr('ItemSearch',['Flash','Books','Medium']); xmlloader.addEventListener(XMLLoader.LOAD_XML_COMPLETE,onLoadXML); var xml:XML=<xml url="" />; xml.@url=urlstr; xmlloader.loadXML(xml); } private function onLoadXML(ce:CustomEvent):void{ xmldatamanager.datasource=XML(ce._target.data); setImages(); setInfos(); } private function setImages():void{ hboximages.init(xmldatamanager.datasource.Items.Item.MediumImage); } private function setInfos():void{ infowindowmanager.init(xmldatamanager.datasource.Items.Item); } ]]> </mx:Script> <v:InfoWindowManager id="infowindowmanager"/> <mx:VBox width="100%" height="100%" backgroundColor="#FFFFFF"> <v:HBoxImages id="hboximages" backgroundColor="#FFFFFF"/> <v:Controler id="lotatecontroler"/> </mx:VBox> </mx:Application>
最初の回転と、床の写り込みと、ユーザー評価などがまだない。
注意点としては、このApplicationタグないでHBoxImagesというカスタムコンポーネントのインスタンスにリスニングの設定をして、そこからInfoWindowManagerのメソッドを呼ぶようにしているが、実際にイベントを発信するのは、HBoxImagesに入れ子になっているImagePlateになっている。
なので、ImagePlateのdispatchEventメソッドで送信するEventインスタンスの引数設定で、bubblesの部分をtrueにしないとこのApplicationタグまで、イベントが届かない。
また、情報表示用のウィンドウでは、InfoWindowというカスタムクラスをポップアップするようにしているが、その中の情報とリンクのハンドラは、InfoWindowManagerがポップアップ時に設定するようになっている。
その際、リスニングの設定をaddEventListenerメソッドの引数のuseWeakReferenceをtrueにすることによって、ウィンドウが閉じられて、参照がなくなった際に、ガーベージコレクションの対象になるようにしている。