Hatena::Groupcoders

ラシウラ出張所 このページをアンテナに追加 RSSフィード

2007/03/22テスト

bellbind20070322

[] AirSWFevalさせたい  [[Air]]のSWFでevalさせたい - ラシウラ出張所 を含むブックマーク はてなブックマーク -  [[Air]]のSWFでevalさせたい - ラシウラ出張所  [[Air]]のSWFでevalさせたい - ラシウラ出張所 のブックマークコメント

(Air SDK対応)

ActionScript3にはevalが無い。だが無いと余計にevalしたいのもまた人情である。

そこでAir APIで追加されたmx:HTMLを使って、JavaScript?evalさせることで、ActionScriptAPIを動的にコード実行させることができた。とはいってもevalするのはActionScriptじゃなくてJavaScriptで、ただその中でSWFAPIもたたけている、というだけなんですけどね。

内部HTMLSWFの連携の参考は

MXMLファイル: Eval.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" 
    layout="vertical"
    title="Eval"
    applicationComplete="init();">
    <mx:Script source="Eval.as"></mx:Script>
    <mx:VBox width="100%">
        <mx:TextArea id="srcText" width="320" height="100" 
           text='toClass("mx.controls.Alert").show("Hello", "Alert");'/>
        <mx:Button id="runSrc" label="run" click="runEval();"/>
        <mx:Text id="outText" width="320" height="100" />
        <mx:HTML id="html" width="0" height="0"/>
    </mx:VBox>
</mx:WindowedApplication>

手書きでGUIリソース作成ですよ。ソースEval.asに切り出しています。

GUIコード用TextArea, 実行Button, 出力Textと見えないevalHTMLを縦に並べたものです。

ActionScriptファイル: Eval.as


private function runEval() : void {
  var src : String = srcText.text;
  eval(src);
}
private function eval(src : String) : void {
  html.htmlControl.window.eval(src);
}

private function alert(text : String) : void {
  mx.controls.Alert.show(text, "Alert");
}


private function print(text : String) : void {
  outText.text = text;
}

private function toClass(name : String) : Object {
  return getDefinitionByName(name);
}

private function init() : void {
  html.location = "Eval.html";
  html.htmlControl.window.alert = alert;
  html.htmlControl.window.print = print;
  html.htmlControl.window.toClass = toClass;
}

ボタンイベントrunEval、とそのなかで呼ぶevalユーティリティのalert、print、toClass、初期にHTMLの読み込みとユーティリティの登録を行うinitの定義。

みそはhtml.htmlControl.window.evalJavaScriptevalを呼び出しているところでしょうか(htmlっていうのはidで参照したmx.controls.HTMLオブジェクト)。

HTMLファイル: Eval.html

<html>
<head>
</head>
<body>
</body>
</html>

実際のところ、空です。

application.xml: Eval-app.xml

<?xml version="1.0" encoding="UTF-8"?>
<application  
  xmlns="http://ns.adobe.com/air/application/1.0.M4"
  appId="net.bellbind.Eval" version="1.0">
      <name>Eval</name>
      <description>Eval Check</description>
      <copyright>(c)2007</copyright>
      <rootContent systemChrome="standard" transparent="false"
          visible="true">Eval.swf</rootContent>
</application>

SWF生成

FL=/programs/flex3sdk/frameworks/libs
axmlc Eval.mxml -output Eval.swf -use-network \
  -include-libraries $FL/flex.swc $FL/utilities.swc \
     $FL/framework.swc $FL/rpc.swc \
     $FL/player/playerglobal.swc \
     $FL/air/airframework.swc $FL/air/airglobal.swc \
     $FL/air/servicemonitor.swc

リンクできるライブラリは全部リンクしちゃいます。

airファイル生成

adt.bat -package Eval.air Eval-app.xml Eval.swf Eval.html

デバッグ実行

adl.exe Eval-app.xml

コード実行

mxmlには埋めてある例コード

toClass("mx.controls.Alert").show("Hello", "Alert");

で、SWFのAlertを出せます。これは

alert("Hello");

でも同じです。

var XMLDocument = toClass("flash.xml.XMLDocument");
var f = new XMLDocument("<foo><bar></bar></foo>");
alert(f.toString());

ということもできました。

問題: なんでruntime.flash.xml.XMLDocumentが使えないの?

ドキュメントサンプルのTextEditorHTMLでは、TextEdit.html内のJavaScript

runtime.flash.filesystem.File.documentsDirectory

とか使ってるんで、evalするテキストでこれができないか試したのですが、runtimeがないとおこられるしだいです。

rootContentで使うタイプHTMLコンポーネントmx:HTMLコンポーネント になっているようです。

次やってみたいこと