前回のサンプルのコードの説明。
ActionScript 3.0では、URLRequestクラスができて、ロードに必要なURLをきれいにまとめられる。
package com.kishineshiki.yahoo{
import flash.net.*;
public class MakeYahooJapanURLRequest{
private static var urlstr:String="http://api.search.yahoo.co.jp/ImageSearchService/V1/imageSearch";
private static var appid:String="自分のID";
public static function searchURL(word:String):URLRequest{
var urlvar:URLVariables =new URLVariables();
urlvar.appid=appid;
urlvar.query="+"+word;
var urlrequest:URLRequest=new URLRequest(urlstr);
urlrequest.data=urlvar;
return urlrequest;
}
private static function extractResult(xmllist:XMLList,uri:String,nodename:Array):XMLList{
var qname:QName=new QName(uri,nodename.shift());
xmllist=xmllist.child(qname);
if(nodename.length>0){
xmllist=MakeYahooJapanURLRequest.extractResult(xmllist,uri,nodename);
}
return xmllist;
}
public static function thumbnailURL(xml:XML):Array{
var urllist:XMLList=extractResult(XMLList(xml),xml.namespace().uri,["Result","Thumbnail","Url"]);
var widthlist:XMLList=extractResult(XMLList(xml),xml.namespace().uri,["Result","Thumbnail","Width"]);
var heightlist:XMLList=extractResult(XMLList(xml),xml.namespace().uri,["Result","Thumbnail","Height"]);
var urlrequestlist:Array=new Array();
for(var i:Number=0;i<urllist.length();i++){
urlrequestlist[i]={urlreq:new URLRequest(urllist[i]),width:widthlist[i],height:heightlist[i]};
}
return urlrequestlist;
}
}
}
YahooJapan WEB APIのレスポンスはXMLにネームスペースを使用しているので、素直にE4Xのメソッドでノードをサーチすることができない。
xml.namespace().uri(ここのuriはストリングなので、ネームスペースの名前がわかっていれば"xs"などとしてもよい) のようにネームスペースを抽出して、
new QName(uri,nodename.shift())のようにQNameというのを作成してノード検索の文字として使う必要がある。 ("Thumbnail","xs:Thumbnail"どちらもノードのオブジェクト名として利用できない。)
呼び出し側の方は以下。
package{
import flash.display.*;
import flash.text.*;
import flash.events.*;
import com.kishineshiki.xml.LoadXML;
import com.kishineshiki.yahoo.*;
import com.kishineshiki.btn.*;
import com.kishineshiki.txt.*;
[SWF(width="600",height="500",backgroundColor="#ffffff",frameRate="24")]
public class YahooImageSearchTest extends Sprite{
private var loadxml:LoadXML;
private var textinput:TextInput;
private var loaderlist:Array;
public function YahooImageSearchTest(){
loadxml=new LoadXML();
loadxml.addEventListener(onLoad);
textinput=new TextInput(150,22);
textinput.x=10;
textinput.y=10;
addChild(textinput);
var searchbutton:ButtonBase=new ButtonBase("search",100,22);
searchbutton.x=170;
searchbutton.y=10;
searchbutton.addEventListener(MouseEvent.CLICK,search);
addChild(searchbutton);
loaderlist=new Array();
}
private function search(event:MouseEvent):void{
loadxml.load(MakeYahooJapanURLRequest.searchURL(textinput.text));
}
private function onLoad(xml:XML):void{
loadSumbnail(xml);
}
private function loadSumbnail(xml:XML):void{
unloadSumbnail();
var currentx:Number=0;
var currenty:Number=40;
var maxy:Number=0;
var requestlist:Array=MakeYahooJapanURLRequest.thumbnailURL(xml);
for(var i:Number=0;i<requestlist.length;i++){
loaderlist[i]=new Loader();
addChild(loaderlist[i]);
loaderlist[i].load(requestlist[i].urlreq);
loaderlist[i].x=currentx;
loaderlist[i].y=currenty;
currentx+=Number(requestlist[i].width);
if((i+1)<requestlist.length&¤tx+Number(requestlist[i+1].width)>600){
currentx=0;
currenty+=maxy;
maxy=0;
}
if(maxy<Number(requestlist[i].height)){
maxy=Number(requestlist[i].height);
}
}
}
private function unloadSumbnail():void{
for(var i:Number=0;i<loaderlist.length;i++){
loaderlist[i].unload();
}
}
}
}
[SWF(・・・)]の部分はflex builder用のコマンドライン引数の代わりになるもの。