ActionScript の Array は dynamic オブジェクトな件

Java を書いてから、ActionScript 3 に戻ると、改めてプロトタイプベースであることを感じることがあります。 今日も Array に関してそんなネタがあったのでメモ。 var array:Array = new Array(); array[“sss”] = 20; array[-1] = “Aaa”; 上記はいずれも通ります。ちなみに負の添え字でセットしても length は 0 のままです。 var array:Array = new Array(); trace(array[10]); 上記は RangeError にならず、undefined が返ります。Vector だと RangeError になります。 var array:Array = new Array(); array[100] = “item”; trace(array[“100”]); 上記のように添え字を文字列しても、ちゃんと item が返ります。length は 101 となり、0〜99までの要素は undefined になります。 var array:Array = new Array(); array[100] = “item”; trace(0 in array); // false; trace(100 in array); // true; ...

2010年8月19日 · Toshimitsu Takahashi

ActionScript 3 で Vector クラスの配列を動的に生成するには

オブジェクトのシリアライズに関する実装をする上で、Vector クラスのリフレクションはできるのか調べてみた。 Vectorクラス名を取得 var classInfo:Object = ObjectUtil.getClassInfo(Vector.); trace(classInfo.name); とすると出力は下記のようになった。 __AS3__.vec::Vector.com.tilfin.sample::Entity こんどは、getDefinitionByName を使って生成してみると var cls:Class = getDefinitionByName("__AS3__.vec::Vector.com.tilfin.sample::Entity") as Class var vector:Vector. = new cls(); もちゃんと上手くいった。ということで色々できそうです。 Vectorユーティリティクラス サンプルとして試しに書いてみた。 package { import flash.utils.getDefinitionByName; import flash.utils.getQualifiedClassName; public class VectorUtil { /** * 指定されたオブジェクトをエレメントとするVectorクラスの配列を返します。 * * @param args 1つ以上のオブジェクトもしくは配列 * @return Vectorインスタンス * / public static function toVector(…args): { var item:; var items:Array; if (args.length == 1) { item = args[0]; if (item is Array) { items = item as Array; } else { items = [ item ]; } } else { items = args as Array; } if (!items || items.length == 0) { throw new ArgumentError(“requires at least one argument.”); } item = items.shift(); var vectorClass:Class = getVectorClass(item); var vector: = new vectorClass(); vector.push(item); for each (var i:* in items) { vector.push(i); } return vector; } /** * 指定されたオブジェクトクラスを格納するVectorクラスオブジェクトを返します。 * * @param value 完全修飾クラス名が必要なオブジェクト * @return Vectorクラスオブジェクト * / public static function getVectorClass(value:):Class { var className:String; if (value is String) { className = value; } else { className = getQualifiedClassName(value); } return getDefinitionByName("__AS3__.vec::Vector.<" + className + “>”) as Class; } } } ...

2010年7月24日 · Toshimitsu Takahashi

ActionScript 3 らしく書いてみたシングルトンのサンプル

Java ライクなシングルトンのサンプルが多いので自分なりに ActionScript らしく書いてみました。 AIR 2 の flash.filesystem.StorageVolumeInfo - Adobe® Flex® 4.1 リファレンスガイド クラスのシングルトン実装が良さそうなのでこれを参考にしてみました。 StorageVolumeInfo は静的な storageVolumeInfo プロパティでシングルトンインスタンスを提供している。 new StorageVolumeInfo() すると、ArgumentError #2012 例外が投げられるようになって-いる。 package { import flash.utils.getQualifiedClassName; /** * シングルトンのサンプル / public class SingletonSample { private static var _instance:SingletonSample = new SingletonSample(); /* * シングルトン提供プロパティ名をクラス名のLowerCamelにする */ public static function get singletonSample():SingletonSample { return _instance; } public function SingletonSample() { if (_instance) { throw new ArgumentError(getQualifiedClassName(this) + " クラスをインスタンス化することはできません。"); } // 初期化処理 _name = “sample name”; } private var _name:String; public function get name():String { return _name; } } } ...

2010年7月22日 · Toshimitsu Takahashi

テレビにTwitterの関連TLをオーバーレイ表示するAIRアプリを作ってみた

部屋にアプリキャストというガジェット機能が使えるブラビアがあるんですが、このガジェットはオーバーレイできないので実際の映像がHD見られなくなってしまいます。そもそも放送法とやらでテレビ上に別の表示を出すのはNGらしいです。まったく不便な話ですね。 で、最近PCでデジタル放送を見たり録画する環境が整ったので、専用PCにHDMIでそのブラビアを繋げてモニターにしてます。F1とか見るときは横目でPCで上げてるTweetDeckを追ってたんですがやっぱり映像に重ねてみたいなと思い、Adobe AIR を使って作ってみました。 できたのが↓です。(F1モナコGPの予選) ちょうど、アナログ→デジタルの過渡期なんで、スーパーが表示されないスペースが左右にあります。そこに乗っけると文字に文字が被って見づらいこともなくなります。 最近覚えた BlendMode = ERASE によるアルファチャネルグラーデーションをかけたりしてます。一応、技術ブログなのでこの部分のソースも書いておきます。下記のコンポーネントの parent には BlendMode.LAYER を設定します。 public class AlphaMask extends UIComponent { public function Overlay() { super(); blendMode = BlendMode.ERASE; } protected override function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { super.updateDisplayList(unscaledWidth, unscaledHeight); var matrix:Matrix = new Matrix(); matrix.createGradientBox(unscaledWidth, unscaledHeight, Math.PI / 2, 0, 0); var g:Graphics = graphics; g.clear(); g.beginGradientFill(GradientType.LINEAR, [0, 0, 0, 0], [1, 0, 0, 1], [0, 25, 230, 255], matrix); g.drawRect(0, 0, unscaledWidth, unscaledHeight); g.endFill(); } } ...

2010年5月15日 · Toshimitsu Takahashi

Adobe AIR 2.0 airhttpd でサーバ側でロードした swf のフレームショットをHTML5対応ブラウザで簡易アニメ表示させてみた

なんか airhttpd を使って面白いものを作れないかと思い、SWFLoader を使って外部 swf ファイルをロードし、そのフレームのスナップショットをHTTPクライアントに返すサーバーアプリを思いついた。 HTML 5 の Canvas 対応をブラウザであればそれを JavaScript で描画していくことができる。 開発環境とライブラリ Flex 3.5 Adobe AIR 2.0 β2 airhttpd - http://code.google.com/p/airhttpd/ ファイル構成 lib/ airhttpd-0.5.swc src/ docroot/ index.html webapp/ CGIService.as Main.mxml CGI処理 airhttpd の FileService クラスを継承して CGIService クラスを作ります。 package webapp { import com.tilfin.airthttpd.server.HttpRequest; import com.tilfin.airthttpd.server.HttpResponse; import com.tilfin.airthttpd.services.FileService; import flash.filesystem.File; public class CGIService extends FileService { private var _snapShotFunc:Function; public function CGIService(snapShotFunc:Function, docroot:File) { super(docroot); _snapShotFunc = snapShotFunc; } override public function doService(request:HttpRequest, response:HttpResponse):void { if (request.path == “/action”) { response.contentType = “image/png”; response.body = _snapShotFunc(); return; } super.doService(request, response); } } } ...

2010年2月21日 · Toshimitsu Takahashi

来年出る Flex 4 関連の書籍がもう予約受付になってる

ずいぶん早くないか? なんせ Flex 4 も Flash Builder 4 もまだβ版なのに・・・。 Flex 4 Cookbook (Oreilly Cookbooks) 作者: Joshua Noble,Todd Anderson,Garth Braithwaite,Marco Casario,Rich Tretola 出版社/メーカー: Oreilly & Associates Inc 発売日: 2010/05/31 メディア: ペーパーバック クリック: 20回 この商品を含むブログ (6件) を見る Flash Builder 4 and Flex 4 Bible 作者: David Gassner 出版社/メーカー: Wiley 発売日: 2010/04/19 メディア: ペーパーバック 購入: 1人 クリック: 14回 この商品を含むブログ (2件) を見る 「Flash Builder 4 and Flex 4 Bible」の方は、1032ページもあるみたい。 クックブックの日本語版が出るのは再来年かな。 ...

2009年12月18日 · Toshimitsu Takahashi

Adobe AIR 2.0 のローカルサーバー機能で HTTP サーバを実装してみた

Adobe AIR | Adobe AIR 3 | Deploy applications Adobe - Adobe AIR 2.0 beta サンプルアプリケーション AIR 2.0 から ServerSocket が提供されて、ローカルサーバを実装することが可能になりました。 まだパブリックベータですがクライアント一辺倒だった AIR の大きな変更なので注目です。 試しに HTTP サーバを実装してみました。拙速ですけど Google Code Hosting で公開しています。 ActionScriptで簡易なサーバサイドプログラミングというのも特殊な要件に使えるかもしれません。 airhttpd - Httpd for Adobe AIR 2.0 SDK http://code.google.com/p/airhttpd/ ServerSocket の不具合 サーバーソケットを一旦bindしたポートはソケットを閉じても解放してくれないようです。まあ、ベータ版なので。 FXUG 勉強会 (2009/12/11) で話します airhttpd の実装を通してサーバーソケットについて紹介します。 B-Wiki - Flex勉強会第93回@東京参加受付 - Flex User Group

2009年11月18日 · Toshimitsu Takahashi

Flex のデータグリッドでセルのテキストを選択可能にする魔法のコード

DataGrid ではセルのテキストを選択するようなことはデフォルトではできません。それを可能にする魔法のコード(大袈裟ですが…)を紹介します。 デフォルトのデータグリッドカラムのアイテムレンダラーである DataGridItemRenderer は UITextField を継承しています。 UITextField の selectable プロパティを true にすると、文字列の選択が可能になります。 下記のように DataGrid のサブクラスを作って、アイテムレンダラーのファクトリの取得時にフックして properties を使って設定するだけです。 public class CellSelectableDataGrid extends DataGrid { override public function get itemRenderer():IFactory { var renderer:ContextualClassFactory = super.itemRenderer as ContextualClassFactory; if (renderer) { renderer.properties = { “selectable”: true }; } return renderer; } }

2009年9月10日 · Toshimitsu Takahashi

Flex のテンプレート HTML ラッパーに細工をしてクエリ引数を flashVars へ引き継ぐには

この話は要 JavaScript です。index.template.html に細工します。 index.template.html 49行目付近 ブラウザの現在のURL引数を取得して params にセットする処理を挿入します。 // Get Parameters var params = “”; var pos = window.location.href.indexOf(’?’); if (pos == -1) { params = “”; } else { params = window.location.href.substr(pos + 1); } 94行目付近 「“flashVars”, params」を挿入します。(前の行の「,」を忘れずに。) } else if (hasRequestedVersion) { // if we’ve detected an acceptable version // embed the Flash Content SWF when all tests are passed AC_FL_RunContent( “src”, “${swf}”, “width”, “${width}”, “height”, “${height}”, “align”, “middle”, “id”, “${application}”, “quality”, “high”, “bgcolor”, “${bgcolor}”, “name”, “${application}”, “allowScriptAccess”,“sameDomain”, “type”, “application/x-shockwave-flash”, “pluginspage”, “http://www.adobe.com/go/getflashplayer", “flashVars”, params );

2009年9月4日 · Toshimitsu Takahashi

Flex の ComboBox の textInputStyleName スタイルプロパティが動的変更に対応していない件

対応していないというかバグだと思う。 ComboBox というか ComboBase に内包する TextInput のスタイル名を指定できる textInputStyleName スタイルプロパティがある。これが creationChildren でしか設定処理が走らない模様。 よって、後から親(ComboBox, DateField など)の styleName プロパティを変えたとして、そのスタイル定義に textInputStyleName 含まれていてもそれが反映されない。 例 .normalTextInput { /* 省略 */ } .afterTextInput { /* 省略 */ } ComboBox { textInputStyleName: normalTextInput; } .afterComboBox { textInputStyleName: afterTextInput; } 上記の定義があったとして、 comboBox.styleName = “afterComboBox”; と動的に設定しても comboBox 内の TextInput に afterTextInput のスタイルは反映されない。

2009年7月14日 · Toshimitsu Takahashi