homeへのリンクです。

FlexBuilderをマスターする 4

2008年09月19日

サムネイルにマウスオーバーしたときに、情報ウィンドウを表示するようにした。
また、サムネイルをクリックしたとき、または、情報ウィンドウ内のタイトルをクリックしたとき、または、「今すぐ買う」ボタンをクリックしたときに、アマゾンの詳細情報ウィンドウを開くようにした。

これらの処理は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にすることによって、ウィンドウが閉じられて、参照がなくなった際に、ガーベージコレクションの対象になるようにしている。