Flash Player APIの最近のブログ記事

StageText は OS ネイティブのテキスト入力を呼び出すクラスです。AIR 3 から利用可能で、Android や iOS で提供されている、便利機能付きの入力フィールドがそのまま使えるようになります。

先日の記事 (Adobe AIR と ActionScript Native Extensions) でも触れたように、ネイティブアプリとの差を埋めることが AIR 3 の主要なゴールであることが伺えます。

一見良さげな StageText ですが、表示オブジェクトではないため、特殊な扱いが要求されたり、フィールド内の描画を OS が行うため、埋め込みフォントが使えない、などの制限があります。

それから、StageText は、AIR アプリが実行されるプラットフォームによって (当然ながら) その振る舞いが異なります。特定の機能を利用する場合は、各プラットフォームでの動作確認が必要になることもありそうです。

ベータ版の ASDoc によると、StageText はデスクトップ環境でも利用できるものの、OS のテキストフィールドではなく Flash のテキストフィールドを使った実装になるようです。おそらく、デスクトップ上ではネイティブのテキストフィールドを利用する利点があまり無いから、ということでしょう。

Flash Player 10.3 及び AIR 2.7 から、マイク入力のアコースティックエコーをキャンセルする機能 (AEC) が追加されました。

AEC は、デスクトップ環境専用の機能です。デバイスには、通常ハードウェアに同等の機能が装備されているため (電話として使えるよう)、AEC の必要性は低いという判断のようです。デバイスでは CPU 負荷の高い処理は避けたいという意図もあったかもしれません。

拡張された Microphone クラス

AEC を実現するため、Flash Player & AIR には Microphone クラスを拡張した AEC 機能付きの Microphone が新しく提供されます。これに伴い Microphone クラスにはメソッドと属性が 1 つずつ追加されます。

  • getEnhancedMicrophone(index:int = -1): Microphone [static]
    AEC機能付きのMicrophoneオブジェクトを返す。一度に使用できるオブジェクトは一つだけ
  • enhancedOptions:MicrophoneEnhancedOptions
    拡張されたマイクの機能を制御するためのオプションを指定

一度に使用できる Microphone のインスタンスは 1 つです。あるインスタンスを使用中に getEnhancedMicrophone() を呼ぶと、そのインスタンスは動作を停止し、Microphone.Unavailable イベントを発行します。

拡張された Microphone オブジェクトの構成を指定するために、新しく MicrophoneEnhancedOptions クラスが導入されました。基本的な使い方は、MicrophoneEnhancedOptions のインスタンスに必要な構成を定義して、Microphone.enhancedOptions 属性に設定する、です。

下は、その簡単なサンプルです。

Flash Player 10.2 から追加された新しい機能の一つに、「ネイティブマウスカーソル」 があります。これは、ビットマップデータを OS レベルのマウスカーソルとして使うことができる機能です。

従来の Flash Player 内の表示オブジェクトを利用する方法と比べると、格段にスムースに動作し、ステージの端で隠れてしまうこともありません。ネイティブカーソルを使うと、今までよりも表現の範囲を広げられそうですね。

MouseCursorData クラスと Mouse クラス

ネイティブマウスカーソルを実現するため、Flash Player 10.2 から flash.ui パッケージに MouseCursorData クラスが追加されました。このクラスは、カーソルとして表示するオブジェクトの情報を管理します。以下の 3 つの属性を持っています。

data: Vector.<BitmapData> カーソルとして表示するビットマップデータ
frameRate: Number         カーソルをアニメーション表示するときのフレームレート
hotSpot: Point            カーソルの基準点となる座標
 

data 属性に指定するビットマップデータの大きさは 32 x 32 ピクセル以下になります。これは OS 側の制限です。これより大きなビットマップを指定するとエラーは発生しませんが、表示もされません。

さて、Mouse クラスにも以下の 2 つのメソッドが追加されています。どちらも static なメソッドです。

registerCursor(name:String, cursor:MouseCursorData):void
ネイティブカーソルのデータを登録
 
unregisterCursor(name:String):void
指定されたネイティブカーソルの登録を削除
 

これらは、ネイティブマウスカーソルのデータ登録に関連するメソッドです。登録時には、データに固有の名前を指定します。

一旦データを登録したら、データの登録名を Mouse クラスの cursor 属性に設定します。これで、ネイティブマウスカーソルが使えるようになります。

下は、ネイティブマウスカーソルを表示するサンプルです。

前回の記事に引き続き、StageVideo クラスの話題です。今回は、StageVideo クラスの属性をいくつか紹介します。

表示領域の設定

StageVideo は、表示オブジェクトではありません。そのため、表示する位置や大きさの設定も、少し独特です。x, y, width, height といった属性は存在しません。

StageVideo の表示位置と表示サイズを指定するには、viewPort 属性を使います。

stageVideo.viewPort = new Rectangle(10, 10, 320, 240);
 

viewPort 属性には、Rectangle オブジェクトを設定します。Rectangle オブジェクトには、表示する位置と大きさをピクセルで指定します。

最初の 2 つの数値が位置の指定になります。それぞれ、横方向と縦方向に、ステージ左上の角から表示位置までの距離を表します。この数値は、-8192 から 8191 の間で指定します。表示領域を、完全にステージ外に移動することもできそうです。

残り 2 つの数値は表示領域の大きさです。こちらも横方向、縦方向の順番です。viewPort の大きさを、表示するステージより大きくすることもできます。

パンとズーム

以下の表示関連の属性を使うと、パンやズームを行うことができます。

Flash Player 10.2 から新しいビデオ機能の Stage Video が追加されますが、既に、Stage Video を利用するための新しいクラス StageVideo の仕様が、公開されています。これは、AIR for TV 用の仕様として公開されたものです。

また、Labs に公開されている、次期 Flex SDK "Hero" のプレビュー版を使うと、StageVideo を利用したコンテンツの開発が行えます。

ということで、この記事では、flash.media.StageVideo クラスの仕様 (現時点の) を解説します。Stage Video の使い方については、前回の記事をご覧下さい。

StageVideo のインスタンスの取得

StageVideo はハードウェア機能を利用します。そのため、スクリプト内で勝手にインスタンスをいくつも作成する、ということはできません。

Stage クラスに新しく追加された stageVideos 属性から、StageVideo のインスタンスを取得します。その際、使えるインスタンスが存在しない、ということもあり得ます。

var vec:Vector.<StageVideo> = stage.stageVideos;
var stageVideo:StageVideo;
if ( vec.length >= 1 )
{
  stageVideo = vec[0];
}
 

利用できる StageVideo の数は、通常 0 から 8 の間です。デバイスでは、0 か 1 になることが多いようです。利用できる StageVideo の数は、その他の状況によっても、都度変わります。

Accelerometer クラスの続きです。今回は少し細かい点をいくつか。

Accelerometer.muted

まず、デバイスによって、アプリケーションからの加速度センサー利用の許可/不許可を切り替えられるものがあるようです。その場合、Accelerometer.isSupported の値が true でも、加速度センサーが利用できない!という状況が起きる可能性があります。

そこで Accelerometer には muted という属性が用意されています。Accelerometer.muted の値が false であれば加速度センサーの使用が許可されている、true であれば拒否されている、という意味です。

アプリケーション実行中に Accelerometer.muted の値が変更された場合には status イベントが発行されることになっています。加速度センサーの状態の変更を検知したい場合は、staus イベントのハンドラを Accelerometer のインスタンスに追加しましょう。Accelerometer が常に利用可能なデバイスでは status イベントが一切発行されないという状況もあるかもですが。

加速度情報更新のタイミング

Flash アプリケーションは AccelerometerEvent.UPDATE イベントを通じて加速度センサーからの更新情報を知ることができます。では、いつ AccelerometerEvent.UPDATE イベントが発生するのか?というと、以下の 3 つの状況になったときだそうです。

  • Accelerometer のインスタンスに新しいリスナー関数が追加された (その際、全ての登録されたリスナー関数にイベントが渡される)
  • デバイスの加速度センサーから更新情報が (ある一定の間隔で) 渡された
  • Flash アプリケーションが Accelerometer から更新を受け取れない状態から復帰した (例:一時的にアイドル状態になっていた)

flash.sensors は Flash Player 10.1 から追加された新しいパッケージです。

名前の通り、このパッケージには、デバイスのセンサーから情報を取得するためのクラスが定義されています。今のところ用意されているのは以下の 2 つです。

  • Accelerometer : 加速度
  • Geolocation : 測位情報

これで、デバイスの動きや位置に反応するアプリケーションが作れます。なお、Geolocation は AIR アプリからのみ利用可能です。(Flash Player では未サポート)

以下に、それぞれのクラスの使い方をまとめてみます。まずは、Accelerometer クラスから。

Accelerometer を利用する前に

Accelerometer クラスは、加速度センサーにより検知されたデバイスの傾きや動きの情報をイベントとして通知する機能を持っています。

Accelerometer の機能は全てのデバイス上で使えるとは限りません。加速度センサーが搭載されていない環境で実行されることもあり得るからです。実行時に Accelerometer が利用できるかどうかは、Accelerometer.isSupported 属性を使って調べることができます。

if (Accelerometer.isSupported)
{
  // Accelerometerの機能が利用できる
}
 

Flash アプリケーションからは、実際に実行されるまで、実行環境に加速度センサーが搭載されているかは分かりません。Accelerometer を利用する場合は、とりあえず Accelerometer.isSupported の値を確認するのがよさそうです。

さて、上でも書いたように、Accelerometer からの情報はイベントとして渡されます。その際に発生するイベントは AccelerometerEvent.UPDATE です。

ということで、Accelerometer のサポート状況が確認できたら、次のステップは Accelerometer のインスタンスを作成して AccelerometerEvent.UPDATE イベントのリスナーメソッドを追加、というのが Accelerometer を使うときのお約束となりそうです。下はそのサンプルです。

デバイス向けのコンテンツを開発するときは、少なくとも当面の間はデスクトップ向けのコンテンツよりも軽くする努力が必要になりそうです。その際、例えば:

  • フレームレートを出来るだけ遅くする
  • タイマーの多重利用を避ける
  • コールバックの処理は軽く
  • 可能なものは MovieClip ではなく Graphics にする

などは分かりやすい最適化かもしれませんが、

  • ベクター描画よりもビットマップ

は、今までの感覚とは違うところかもしれません。

(将来の Flash Player では新しい最適化機能 & API が提供されて、ベクターでも大丈夫ってことになるかもしれませんけれど)

DisplayObject.cacheAsBitmap を使った最適化

cacheAsBitmap に true を設定すると実行時に DisplayObject をビットマップ化することが出来ます。複雑なベクターデータの描画を纏められるため、複雑な図形ほど描画パフォーマンスを向上させることが出来ます。

デバイス上ではこれによる高速化は特に効いてくるところなのですが、

  • もし DisplayObject がそもそも変化しないものであれば、ビットマップデータを使用したほうがより効果的
  • 頻繁に変化する DisplayObject に対して cacheAsBitmap = true をセットすると、ビットマップ化のオーバーヘッドにより逆効果になることも

という点もあります。ご参考まで。

ビットマップの使用とミップマッピング

改めて書くほどのことでもないですけれど、ビットマップを使うときは、予め小さく軽くしたものを使用して、出来るだけ実行時に縮小するといったことの無いようにします。

もし、実行時にビットマップを縮小する必要がある場合は、可能であればビットマップの大きさをミットマッピングが出来る大きさにすることが望ましいとされています。ミットマッピングは Flash Player 9 から追加されている機能で、ビットマップを描画する際の品質とパフォーマンスを向上するものです。品質に関してはこちらのデモが分かりやすいかもです。

Flash Player に搭載されているミップマッピングは box filtering と言われる一番単純なものです。PNG, JPEG 等の静的なビットマップにのみ適用され、実行時に cacheAsBitmap の指定により作られるビットマップには適用されません。詳しくは ActionScript のヘルプをご覧ください。(Adobe ActionScript 3.0 * ミップマッピングの利用

Mip マップを有効に活用するには、画像の幅と高さを 2 で何回も割れる数値にします。例えば、512 × 256 は非常にミップマッピング向きですが、510 × 256 はそうでもありません (一度しか割れないので)。

デバイスは機種により PPI が大きく異なります。例えば Experia X10 のインチあたりのピクセル数は iPhone 3GS のほぼ倍、そのため同じ画像でも Experia X10 では iPhone 3GS の半分程度の大きさで表示されることになります。

デバイス向けコンテンツでは、同じ画像を縮小率を変えながら使いまわすケースも多くなるかもしれません。心に留めておくと少しは役に立つことがあるかもです。

Flash Player 10 から動的に生成したサウンドを再生する機能がサポートされています。ベータ 2 で変更された点などもありますので遅ればせながらご紹介します。

まず、この機能を使うには Sound オブジェクトに Event.SAMPLE_DATA のイベントハンドラを設定します。そうすると Sound オブジェクトの動作が通常と変わり、定期的にイベントハンドラを呼び出しては再生するデータを読み込むようになります。このとき SoundChannel は読み込まれたデータを一連のオーディオデータストリームとして再生します。

var mySound:Sound = new Sound();
mySound.addEventListener(Event.SAMPLE_DATA, onSampleData);
var myChannel:SoundChannel = mySound.play();
 
function onSampleData(event:SampleDataEvent):void 
{
  // この中で SoundChannel にデータを書き込む
}
 

SAMPLE_DATA 用イベントハンドラ内では、イベントオブジェクトから渡される ByteArray オブジェクトにオーディオデータを書き込みます。イベントオブジェクトの型は Flash Player 10 から新しく追加された sampleDataEvent で、以下の属性が利用できます。

public data : ByteArray   // オーディオストリーム内のデータ
public position : Number  // オーディオストリーム内の位置
 

ByteArray オブジェクト (event.data) に書き込む値は 32 ビット big endian 浮動小数点数形式の 44.1KHz ステレオデータです。従って一つのサンプルデータの大きさは 8 バイト (4 バイトのデータが左右それぞれ) になります。

下は sampleData イベントハンドラの例です。単純なサイン波形をデータとして書き込んでいます。再生すると聴覚検査で聴くような音がすると思います 。

Flash Player 10 ではローカルファイルを直接 Flash アプリケーションに読み込んだり Flash アプリケーション内のデータを直接ローカルファイルに書き出す機能が追加されています。

Flash Player 9 でも FileReference を使ってローカルファイルにアクセスすることは可能です。が、その機能はファイルのアップロード/ダウンロードを行うためのもので、Flash アプリケーションからは、一旦サーバを経由しないとローカルファイルのデータを扱うことができませんでした。直接ファイル I/O の出来る日が来ることを心待ちにしていた方も多いことでしょう。

というわけで、Flash Player 10 では flash.net.FileReference クラスに以下の API が追加されています。

public function get data():ByteArray // 読み込まれたデータ (読み取り専用のプロパティ)
public function load():void          // 指定されたファイルの読み込み開始
public function save(data:*, name:String = null):void 
                                     // 保存先を選択するダイアログを表示、その後データ保存開始
 

ファイルの読み込みを開始するには load() メソッドを使用します。読み込むファイルの指定は、browse() メソッドを呼ぶとダイアログが表示されるので、その中でユーザが行います。

このときプログラムから読み込むファイルを指定することはできません。これは SWF がロードされたら勝手にローカルファイルを送信してしまうといった類のアタックからユーザを保護するためです。

load() は呼び出されるとすぐに戻るので、その後の進み具合はイベント経由で確認することになります。このあたりは従来の FileReference の使い方と同じです。

下は、ファイルを読み込む簡単なサンプルです。

引き続きエンコード関連の関数を紹介します。今回は URI をエンコードするための関数です。

encodeURI() 関数と decodeURI() 関数

encodeURI() 関数 (livedocs@lab) は URI 文字列を UTF-8 値にエンコードします。英数字は変換の対象外ですが、他にも URI の一部として使われる記号は変換されません。

var str:String = "http://w.c/a?b+ま&";
trace(encodeURI(str)); // http://w.c/a?b+%E3%81%BE& が出力される

escape() 関数と unescape() 関数

escape() 関数は (livedocs@lab) は文字列を URL エンコードのフォーマットに変換するグローバル関数です。基本的に、英数字以外の文字であれば % 付の16進数に変換されます。+ などいくつか変換されない文字もあります。

trace(escape("1+3%2=0")); // 1+3%252%3D0 が出力される
trace(escape("h:m@u/a?b&c")); // h%3Am@u/a%3Fb%26c が出力される
trace(escape("ハロー")); // %u30CF%u30ED%u30FC が出力される

describeType() メソッド (livedocs@lab) は引数に渡されたオブジェクトの情報を XML 形式で返します。引数には ActionScript の任意のオブジェクトを(クラスや int なども)渡すことができます。

var mc:MovieClip = new MovieClip();
var typeInfo:XML = describeType(mc);

返される XML オブジェクトに含まれる情報は引数として渡されたオブジェクトの属性やメソッド等です。Java のリフレクションと同じような機能です。

ようやく new Dictionary() が実行できるようになったので続きです。

weak-value ディクショナリー

以前の記事に書いたように、Dictionary クラスは weak-key ディクショナリーの機能を持っています。キーオブジェクトへの参照が弱い参照のため、使われなくなったキーとそのエントリーを自動的に開放するという使い方ができます。

一方、値として管理されているオブジェクトがしばらく参照されなかったら自動的に開放するという使い方はできません。

Dictionay クラス (livedocs@lab) は beta2 から追加されたクラスで、オブジェクトをキーとして値を管理することができます。Object を使っても同じように連想配列を実現できますが、Dictionary ではいわゆる"弱い参照"が使えます。

また、Object では文字列がキーとして扱われるため toString() の値が同じオブジェクトは全て同じキーとして扱われますが、Dictionary では別々のオブジェクトであれば toString() の値に関わらず異なるキーとして扱われます。

StringBuilder クラス (livedocs@lab) は String と同じように文字列を扱うクラスですが、特に文字列に追加や挿入などの操作を何回も行うような場合に使います。String と違い、操作の度に新しいオブジェクトを生成したりしないため、メモリをより有効に使用することができます。特に、細かな追加を何回も行う場合には String と比べて高速です。

StringBuilder のインスタンスを生成するにはコンストラクタを使用します。String のように直接文字列で初期化することはできません。

Proxy クラス (livedocs@lab) は既存のオブジェクトの振る舞いを変えたいときに使います。例えば、Proxy のサブクラスである ObjectProxy クラス (livedocs@lab) は属性が変更されたとき、イベントでそれを知らせることができるようになっています。(注:ObjectProxy は Flex 2 フレームワークのクラスです)

Proxy クラスにはコンストラクタがありません。従って、Proxy クラスを使用する際は、サブクラスを定義しメソッドをオーバーライドするのが基本です。オーバーライドしていないメソッドが呼ばれた場合は例外が投げられます。

Timer クラス (livedocs@lab) は一定の間隔毎に処理を行いたい場合に使用します。Timer のインスタンスは、予め設定された時間が経つとイベントをディスパッチします。

Timer クラスは AS2 の setInterval() / getInterval() を置き換えるものです。AS3 でも setInterval() / getInterval() は共に flash.util パッケージ下にあり使用可能ですが、これは既存のコードとの互換性を持たせるためと考えるのがよさそうです。

Timer を使用するには、まずインスタンスを作成します。コンストラクタの引数にはイベントまでの待ち時間をミリ秒単位で指定します。

Loader オブジェクトで (URLLoader ではありません) swf ファイルをロードするとき、ロード先のアプリケーションドメインを指定することができます。

アプリケーションドメインはクラス定義の単位になるため、実行時に swf をロードすることで動的にクラス定義を追加するといった使い方ができます。また、複数のアプリケーションドメインを持つことができるため、同じクラスの異なるバージョンを同時にアプリ内で使うことも可能です。

それでは、アプリケーションドメインの使い方について詳しく見ていきましょう。

今回は、flash.net パッケージの関数2つを紹介します。

navigateToURL() 関数

AS3 アプリケーションからもう一つブラウザのウインドウを開きたい、あるいは今 AS3 アプリケーションを実行中のウインドウを他の HTML コンテンツで置き換えたいというときには navigateToURL() 関数 (livedocs@lab) を使います。以下が関数の定義です。

2014年1月

Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
レンタルサーバー

月別 アーカイブ

Powered by Movable Type 4.261