3

Adobe AIR を使用して、Android フォン用の APK ファイルを作成しています。APK パッケージ内には SWF ファイルがあり、SWF ファイルと同じフォルダーに、image.jpg を含む「images」という名前のサブフォルダーがあります。

実行時にその image.jpg をプログラムに読み込もうとしていますが、その場所を取得できません (プログラムはそれを見つけられないようです.

これが私が試していることです:

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
loader.load(new URLRequest("images/image.jpg"));
while (bitmapData==null) {}  //wait until loaded
return bitmapData;

onComplete 関数 puts は bitmapData フィールドを設定します。ただし、COMPLETE イベントは発生しないため、while ループは存在しません。

私も試しました:

loader.load(new URLRequest("/images/image.jpg"));
loader.load(new URLRequest("app:/images/image.jpg"));
loader.load(new URLRequest("app-storage:/images/image.jpg"));
loader.load(new URLRequest("file:/images/image.jpg"));

どれも機能しません。

生成された SWF ファイルのみを実行している場合 (images サブフォルダーは SWF ファイルと同じフォルダーにあります)、APK ファイルなしで試しても、これを機能させることはできません。

JPG を SWF ファイル自体に埋め込むことはできません。これは、大量の画像ファイルが必要であり、Flash CS6 はこのような大きな SWF ファイルを作成するときにメモリ不足になるためです (画像を外部から読み取ると、コンパイル時間が大幅に短縮されます)。 )。

何か案は?外部 JPG ファイルを BitmapData に入れるにはどうすればよいですか? 画像は APK ファイルの外側ではなく、その中にパッケージ化されていることに注意してください。

注: 後で iOS ipa パッケージにもエクスポートするので、そこでも動作する必要があります。


私の評判のために自己回答できないため、編集します。

Strill のおかげで、ActionScript 仮想マシンがシングルスレッドであることを実感しました。

そのため、イメージがロードされるまでスレッドをスリープ (待機) させることはできません。代わりに、 onComplete関数が呼び出されたときに処理を停止して続行できるように、多くのコードを書き直す必要があります。

以前に試したこのことは実際には機能しますが、while ループのために完了できませんでした:

loader.load(new URLRequest("app:/images/image.jpg"));
4

2 に答える 2

1

私の記憶が正しければ、次のようにできるはずです。

loader.load(new URLRequest(new File("app:/images/image.jpg").url));

File クラスを使用しているため、上記は Flash Player では実行されず、iOS または Android でのみ実行されます。

于 2012-10-20T20:01:30.607 に答える
0

私の経験から、実行中の Android アプリから AIR を使用してアセットをロードするには、2 つの実用的な方法があります。

  1. File インスタンスの URLLoader と .url プロパティを使用する
  2. FileStream を使用する (File インスタンスを受け取る)

プロジェクトに追加

アプリの .xml 記述子ファイル内で、アイコンをパッケージ化するのと同じ手法を使用して、APK 内にファイルをパッケージ化できます。

Android セクション (IntelliJ および Flash Builder に適用) の「パッケージ化するファイルとフォルダー」でそれらを IDE に追加してください - 必要なアセットフォルダーへのパスを追加し、それに相対名のエイリアスを付けます。

推敲

アセット自体は、(APP のインストール時に) AIR で使用可能な「 applicationDirectory 」内に配置されます。

しかし、新しい Android OS と Flash Player のセキュリティの問題により、これらのアセットにはnativePathを介してアクセスすることはできず、 Fileインスタンスの ' url ' プロパティのみを介してアクセスできます。

ベスト プラクティス

File インスタンスの URLLoader と .url プロパティを使用します。これは本質的に非同期でもあり、ネイティブ デコーダーを使用して PNG / JPG ファイルを解決できるため、FileStream (これはByteArrayを返します)を手動で読み取る必要はありません。

var f:File = File.applicationDirectory.resolvePath('images/myimage.png');
loader.load(new URLRequest(f.url));

さらに方法が不足している場合は、お知らせください... )

于 2016-11-06T13:39:06.417 に答える