Android用のAdobe AIR 2.6でクラスのリンクを使用してSWFを読み込んでその要素へのアクセスに問題があります。誰か知っていれば助けてください。同じクラスリンクの問題を持つムービークリップで別のswfをロードする
問題:
私は2つの異なるの.swfファイルがあります。NAME2とのMovieClipクラスを持っている
file1.swf(NAME1とのMovieClipクラスのリンケージ 'mainScreen' を持っている)
file2.swfを(リンケージ 'mainScreen')
私は自分のアプリケーションドメインでインポートする必要があるいくつかのアクションスクリプトコードを持っています。
ファイルをダウンロードしています。
ダウンロード後、それらは異なるアプリケーションドメインにあります
しかし、私はクラスリンケージによって要素を取得し、2番目に読み込まれたステージ専用の要素に追加します。同じクラスのリンケージを持つ2番目のムービークリップのように見えるので、最初のムービークリップが置き換えられます。このため
私は、このようなアプローチを使用しています:
してください、私は同じクラスのリンケージを持つ要素を持つ2つの異なる要素のSWFファイルをロードすることができますどのように役立つか、私はこれを行うことはできません理由を説明しますか? エレメントに異なるクラスリンケージがある場合は、すべてOKです。しかし!!!それはウェブのために働いていますが、空気のために働きたくありません。
package
{
import flash.display.*;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.errors.*;
import flash.events.*;
import flash.net.*;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
import flash.system.Security;
import flash.system.SecurityDomain;
import flash.utils.*;
import flash.utils.ByteArray;
import org.bytearray.explorer.SWFExplorer;
import org.bytearray.explorer.events.*;
public class LoadSWFTest extends Sprite
{
private static const LOADERS_COUNT:int = 2;
private var asset_loader1:Loader;
private var asset_loader2:Loader;
private var finishedLoaders:int;
private var urlLoader1:URLLoader;
private var urlLoader2:URLLoader;
private var finishedURLLoaders:int;
private var movAssets:MovieClip;
private var movReels:MovieClip;
private static const initAssetsStr:String = "http://dl.dropbox.com/u/11/name1.swf";
private static const reelsStr:String = "http://dl.dropbox.com/u/11/name2.swf";
public function LoadSWFTest()
{
super();
// support autoOrients
//stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.EXACT_FIT;
this.scaleX = 0.5;
this.scaleY = 0.5;
this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
private function onAddedToStage(event:Event):void
{
this.removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
//draw black background
with(graphics)
{
beginFill(0x0)
drawRect(0,0,stage.stageWidth,stage.stageHeight);
}
initURLLoaders();
}
private function initURLLoaders():void
{
finishedURLLoaders = 0;
trace("finishedLoaders: " + finishedURLLoaders);
//first loader
urlLoader1 = new URLLoader();
urlLoader1.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader1.addEventListener(Event.COMPLETE, loadCompleteURLLoaders);
var url1:URLRequest = new URLRequest(initAssetsStr);
urlLoader1.load(url1);
//reels
urlLoader2 = new URLLoader();
urlLoader2.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader2.addEventListener(Event.COMPLETE, loadCompleteURLLoaders);
var url2:URLRequest = new URLRequest(reelsStr);
urlLoader2.load(url2);
}
private function loadCompleteURLLoaders(event:Event):void
{
finishedURLLoaders += 1;
trace("loadCompleteURLLoaders. finishedURLLoaders: " + finishedURLLoaders);
if (finishedURLLoaders == LoadSWFTest.LOADERS_COUNT)
{
init();
}
}
//init
private function init():void
{
finishedLoaders = 0;
trace("finishedLoaders: " + finishedLoaders);
var context1:LoaderContext = new LoaderContext(true);
context1.checkPolicyFile = false;
context1.allowCodeImport = true;
context1.applicationDomain = ApplicationDomain.currentDomain;
var context2:LoaderContext = new LoaderContext(true);
context2.checkPolicyFile = false;
context2.allowCodeImport = true;
context2.applicationDomain = ApplicationDomain.currentDomain;
var arr1:ByteArray = urlLoader1.data as ByteArray;
var arr2:ByteArray = urlLoader2.data as ByteArray;
//first loader
asset_loader1 = new Loader();
asset_loader1.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
asset_loader1.loadBytes(arr1, context1);
//reels
asset_loader2 = new Loader();
asset_loader2.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
asset_loader2.loadBytes(arr2, context2);
}
private function loadComplete(event:Event):void
{
finishedLoaders += 1;
trace("loadComplete. finishedLoaders: " + finishedLoaders);
if (finishedLoaders == LoadSWFTest.LOADERS_COUNT)
{
downloadCompleted();
}
}
private function downloadCompleted():void
{
trace("downloadCompleted");
movAssets = getSkinAsset(asset_loader1, 'mainScreen1') as MovieClip;
movReels = getSkinAsset(asset_loader2, 'mainScreen2') as MovieClip;
addChild(movAssets);
setTimeout(showMovie, 5000);
}
private function showMovie():void
{
addChild(movReels);
}
///////////////////////////////////////////////
public function hasAsset(asset_loader:Loader, assetName:String):Boolean
{
try
{
var assetClass:Class = asset_loader.contentLoaderInfo.applicationDomain.getDefinition(assetName) as Class;
return assetClass!=null;
}
catch(e:Error)
{
trace(e);
return false;
}
return false;
}
public function getSkinAsset(asset_loader:Loader, assetName:String):DisplayObject
{
try
{
trace("getSkinAsset: " + assetName);
var memoryHash:String;
try
{
FakeClass(asset_loader);
}
catch (e:Error)
{
memoryHash = String(e).replace(/.*([@|\$].*?) to .*$/gi, '$1');
}
trace("asset_loader: " + memoryHash);
try
{
FakeClass(asset_loader.contentLoaderInfo.applicationDomain);
}
catch (e:Error)
{
memoryHash = String(e).replace(/.*([@|\$].*?) to .*$/gi, '$1');
}
trace("app domain: " + memoryHash);
trace("Loader: " + asset_loader.contentLoaderInfo.url + " appDomain: " + asset_loader.contentLoaderInfo.applicationDomain);
var assetClass:Class = asset_loader.content.loaderInfo.applicationDomain.getDefinition(assetName) as Class;
var disObj:DisplayObject = new assetClass();
return disObj;
}
catch(e:Error)
{
throw new IllegalOperationError('getSkinAsset('+assetName + ') - error msg: ' + e.message);
}
return null;
}
}
}
内部finalクラスFakeClass {}