マジか。SDKの想定環境はCドライブだ・・
Android SDK and AVD Manager(installer_r12-windows.exe)の絶対想定環境はCドライブらしく、avdの定義ファイルは別ドライブに作成できているのに、Android Emulatorが起動しようとするのはCドライブ直下のユーザディレクトリ。想定パスにファイルを移動して再起動してみたが・・
invalid command-line parameter: Files. Hint: use '@foo' to launch a virtual device named 'foo'. please use -help for more information
ちょっとこれ調べてみたら、
Problem was solved. First, I uninstalled the SDK's, then reinstalled them directly to my C:\drive. The second part involved a bug in the code file: C:\ProgramData\Titanium\mobilesdk\win32\1.7.1\android\builder.py. I found the answer here: Titanium Emulator Launch error. http://developer.appcelerator.com/question/122513/emulator-error-hint-use-foo-to-launch-a-virtual-device-named-foo
って事で、とりあえず全リインストール・・;-(
ちなみに、アンインストールしても何故かうまくいかないって時は、アンインストールした奴についてたadb.exeが生きたままになってたりとか。killしちゃってください。
追記
Cにインストールしたけど、ダメだった。同じメッセージしかでなくて。
Maybe if you have installed the SDK into "C:\Program Files(x86)\Android\android-sdk" instead of "C:\Program Files\Android\android-sdk", 'C:\PROGRA~1\Android\android-sdk' will no longer work. Instead, use : 'C:\PROGRA~2\Android\android-sdk'. Hope this helps! http://developer.appcelerator.com/question/122513/emulator-error-hint-use-foo-to-launch-a-virtual-device-named-foo
ってことで、PROGRA~2へインストールしてみた。モジュールDL中。これはパスしたいな。。
オオ。ホーム画面へ辿りつけた。。
変なところでハマって、これ以上は時間オーバー。
ADTからSDK Managerを起動すると、今度は最初に設定した別ディレクトリを参照しちゃってて、エミュレータが起動しない。謎すぎる・・。
追記:
Cドライブっていうより、ユーザディレクトリがあるドライブぽい。僕は容量の関係でシステムドライブじゃなくてZドライブとかにしてた。何故か、SDKManagerがZドライブを見る(レジストリ綺麗にしたり、androidとつくディレクトリを片っ端から消したりしたのに)ので不思議に思ってたけど、そういう事ぽい。
ちなみに、Progra~2はEclipse連動でもずっと必要だった。
FlexSDKでOpenTypeフォントを埋め込む方法
AS3 Projectで下記ソースを作成し、srcフォルダにDeFonteNormale.otfを配置後、ビルド&デバッグ実行。
package { import flash.display.Sprite; import flash.text.TextField; import flash.text.TextFormat; public class Main extends Sprite { [Embed(source = "DeFonteNormale.otf", fontName = "DeFonte", embedAsCFF="false")] private var font:Class; public function Main() { var tf:TextField = new TextField(); tf.embedFonts = true; tf.defaultTextFormat = new TextFormat("DeFonte", 24, 0x0); tf.autoSize = "left"; addChild(tf); tf.text = "windows"; } } }
transcodeエラーがでたら、src/直下にotfファイルを置いているか確認する。src/assetsとか../assets/とかに置いてたら、Embedのsourceをsrcディレクトリを基点にして相対パスで書けばいいのかもしれない。(元ファイルがないから変換できやんで、という意味か)。試したときに使ったフォントは、Defonte( http://www.ingofonts.de/ingofonts/fonts/freefonts.html ) - 英字のみ。日本語や半角数字は表示されない。
develop env: FlashDevelop 3.3.4 RTM for Microsoft.NET 2.0 Runtime / FlexSDK 4.1.0 ( FlashDevelop current version contains ) / Flash Player 10
その他環境
FlexSDK 3.5 MPL
-
-
- -
-
FlexSDK 3.5 Adobe
-
-
- -
-
font engine
一応、FlexSDK4.0以前のFontEngineであるAFE(Adobe Font Engine)でも、OpenTypeを限定的にサポートしているようだけれど、いまいち文意が読み取れない(http://livedocs.adobe.com/flex/3/html/help.html?content=fonts_06.html)。システムフォントはsrc:localで、URL?フォントはsrc:urlとか書かれてる。
うーん。urlとlocalって、結局ファイルパスを指定してるから表面的な意味は同じじゃね?( http://livedocs.adobe.com/flex/3_jp/html/help.html?content=fonts_04.html )。 厳密なところ(ファイルパスとURIは概念が違う)とかはこの際どうでもいいんだけれど。全体的な視点では個別の利点があるかもしれないけれど、ロード時間の観点で見ると、どっちでも結果は同じかもしれず。んでも、Adobeのヘルプページに書かれてる方法(Embedでリソースを読み込んで、CSSで参照)が良く分からない。これが実現できてないと、urlでの指定って出来ないって事なのかな。よくわからん。
AdobeFlashCS5.5のFontEngineは何が使えるのか調べないとな。多分、Flex4.0で採用されてるCFFFontEngineとか普通に使えちゃうんじゃないかしら。そしたら余計な事考えなくて良い。
イベントリスナー覚書
引数を与える場合のイベントメソッド
fuga.addEventListener(Fuga.complete, hogeFunc(hoge)); private function hogeFunc(value:Hoge):Function { return function(e:Event):void { e.target.getFooMethod(); e.target.removeEventListener(Fuga.complete, e.target); } }
複数の非同期メソッドが全て完了したら、というイベント
試す環境が整ってないので、概要だけを書いています。
/* delegateパターンでIEventDispatcherを実装したとする */ public class Queue implements IEventDispatcher { private var remains:int; // queueの数 public static const complete:String = "queue_complete"; public static const all_complete:String = "all_complete"; public function Queue(list:Array) { this.remains = list.length; this.addEventListener(Queue.complete, decreaseRemains); for( i=0;i<list.length;i++) { hogeSomethingLoad(list[i]); } } /** * 処理が完了したらイベント発生 * * @eventType Queue.complete */ private function hogeSomethingLoad(value:Object):void { // doSomethingAsyncProccess... dispatchEvent(new Event(Queue.complete)); } /** * complete毎にremainsを減らしていき * 0になったところで、全てのタスクが終わったとし * all_completeイベントを発生させる。 * * @eventType Queue.all_complete */ private function decreaseRemains(e:Event):void { --this.remains; if(this.remains<0) { /* Queueをインスタンス化するクラス側でqueueインスタンスに対してaddListenerして受け取る */ this.dispatchEvent(new Event(Queue.all_complete)); } } }
連想配列は極力使わない方がいい感じ
// このように表現できるが、無名オブジェクト型はコード補完しにくい var hoge:Object = {name:"wenly", age:21, gender:"woman"}; // どうせ同じ行数を書くなら、こっちの方が管理しやすいし補完できる var hoge:Hoge = new Hoge("wenly", 21, "woman"); --- public class Hoge { public var name:String; public var age:uint; public var gender:String; public function Hoge(_name:String, _age:uint, _gender:String) { this.name = _name; this.age = _age; this.gender = _gender; } // フィールドをprivateにしてget/setでプロパティ化してもいいけど // インスペクタみたいなデバッガでオブジェクトの中身を見ると、 // プロパティとフィールドが両方でて見辛くなるから僕はやらない } // Arrayに詰めた場合でも、次のようにFlashDevelop記法で補完できちゃう var fuga:/* Hoge */Array = [ new Hoge(...snip...), new Hoge(...snip...) ]; // fuga[0].<このタイミングでnameとかageとか変数候補が出てくる // ただし、ネストしている場合は・・・コード補完の方法はない?