Görüntüleme içeriğini dinamik olarak yükleme

Flash Player 9 ve üstü, Adobe AIR 1.0 ve üstü

Şu harici görüntüleme varlıklarından herhangi birini ActionScript 3.0 uygulamasına yükleyebilirsiniz:

  • ActionScript 3.0'da geliştirilmiş bir SWF dosyası—Bu dosya bir Sprite, MovieClip veya Sprite öğesini genişleten herhangi bir sınıf olabilir. iOS'deki AIR uygulamalarında yalnızca ActionScript bayt kodunu içermeyen SWF dosyaları yüklenebilir. Bu, görüntü ve ses gibi gömülü veri içeren SWF dosyalarının yüklenebileceği, ancak yürütülebilir kod içeren SWF dosyalarının yüklenemeyeceği anlamına gelir.

  • Görüntü dosyası—Bunlar arasında JPG, PNG ve GIF dosyaları yer alır.

  • AVM1 SWF dosyası—Bu, ActionScript 1.0 veya 2.0'da yazılmış bir SWF dosyasıdır. (Mobil AIR uygulamalarında desteklenmez)

Loader sınıfını kullanarak bu varlıkları yüklersiniz.

Görüntüleme nesnelerini yükleme

Loader nesneleri, bir uygulamaya SWF dosyaları ve grafik dosyaları yüklemek için kullanılır. Loader sınıfı, DisplayObjectContainer sınıfının bir alt sınıfıdır. Loader nesnesi, görüntüleme listesinde (yüklediği SWF veya grafik dosyasını temsil eden görüntüleme nesnesi) yalnızca bir alt görüntüleme nesnesi içerebilir. Görüntüleme listesine bir Loader nesnesi eklediğinizde, şu kodda olduğu gibi, yüklenen alt görüntüleme nesnesini yüklemenin ardından görüntüleme listesine ekleyebilirsiniz:

var pictLdr:Loader = new Loader(); 
var pictURL:String = "banana.jpg" 
var pictURLReq:URLRequest = new URLRequest(pictURL); 
pictLdr.load(pictURLReq); 
this.addChild(pictLdr);

SWF dosyası veya görüntü yüklendikten sonra, bu örnekteki container DisplayObjectContainer nesnesi gibi, yüklenen görüntüleme nesnesini başka bir görüntüleme nesnesi kabına da taşıyabilirsiniz:

import flash.display.*; 
import flash.net.URLRequest; 
import flash.events.Event; 
var container:Sprite = new Sprite(); 
addChild(container); 
var pictLdr:Loader = new Loader(); 
var pictURL:String = "banana.jpg" 
var pictURLReq:URLRequest = new URLRequest(pictURL); 
pictLdr.load(pictURLReq); 
pictLdr.contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoaded);  
function imgLoaded(event:Event):void 
{ 
    container.addChild(pictLdr.content);  
}

Yükleme ilerlemesini izleme

Dosya yüklenmeye başladıktan sonra, bir LoaderInfo nesnesi oluşturulur. LoaderInfo nesnesi, yükleme ilerlemesi, yükleyici ve yüklenenin URL'leri, medyanın toplam bayt sayısı ve medyanın nominal yüksekliği ve genişliği gibi bilgiler sağlar. LoaderInfo nesnesi, yükleme ilerlemesinin izlenmesine yönelik olaylar da gönderir.

Aşağıdaki diyagram, LoaderInfo nesnesinin farklı kullanımlarını gösterir—örneğin, bir Loader nesnesi için ve Loader nesnesi tarafından yüklenen nesne için SWF dosyasının ana sınıfı:

LoaderInfo nesnesine, hem Loader nesnesinin hem de yüklenen görüntüleme nesnesinin bir özelliği olarak erişilebilir. Yükleme başladığı anda, Loader nesnesinin contentLoaderInfo özelliği üzerinden LoaderInfo nesnesine erişilebilir. Görüntüleme nesnesinin yüklemesi sona erdiğinde, yüklenen görüntüleme nesnesinin bir özelliği olarak görüntüleme nesnesinin loaderInfo özelliği üzerinden de LoaderInfo nesnesine erişilebilir. Yüklenen görüntüleme nesnesinin loaderInfo özelliği, Loader nesnesinin contentLoaderInfo özelliği olarak aynı LoaderInfo nesnesini ifade eder. Başka bir deyişle, yüklenen bir nesne ile o nesneyi yükleyen Loader nesnesi arasında (yükleyen ile yüklenen arasında) LoaderInfo nesnesi paylaşılır.

Yüklenen içeriğin özelliklerine erişmek için, aşağıdaki kodda olduğu gibi, LoaderInfo özelliğine bir olay dinleyicisi eklemek istersiniz:

import flash.display.Loader; 
import flash.display.Sprite; 
import flash.events.Event; 
 
var ldr:Loader = new Loader(); 
var urlReq:URLRequest = new URLRequest("Circle.swf"); 
ldr.load(urlReq); 
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded); 
addChild(ldr); 
 
function loaded(event:Event):void 
{ 
    var content:Sprite = event.target.content; 
    content.scaleX = 2; 
}

Daha fazla bilgi için Olayları işleme bölümünü inceleyin.

Yükleme içeriği belirtme

Loader sınıfının load() veya loadBytes() yöntemi üzerinden Flash Player ya da AIR uygulamasına harici bir dosya yüklediğinizde, isteğe bağlı olarak bir context parametresi belirtebilirsiniz. Bu parametre bir LoaderContext nesnesidir.

LoaderContext sınıfı, yüklenen içeriğin kullanılabileceği bağlamı tanımlamanızı sağlayan üç özellik içerir:

  • checkPolicyFile : Yalnızca bir görüntü dosyası (SWF dosyası değil) yüklerken bu özelliği kullanın. Bu özelliği true değerine ayarlarsanız, Loader öğesi ilke dosyası için kaynak sunucuyu kontrol eder (bkz. Web sitesi denetimleri (ilke dosyaları) ). Bu yalnızca Loader nesnesini içeren SWF dosyasının etki alanları dışındaki etki alanlarından ortaya çıkan içerik için gereklidir. Sunucu, Loader etki alanına izin verirse, Loader etki alanında bulunan SWF dosyalarındaki ActionScript, yüklenen görüntüdeki verilere erişebilir; başka bir deyişle, yüklenen görüntüdeki verilere erişmek için BitmapData.draw() komutunu kullanabilirsiniz.

    Loader nesnesinin etki alanı dışındaki etki alanlarında bulunan bir SWF dosyasının, belirli bir etki alanına izin vermek için Security.allowDomain() öğesini çağırabildiğini unutmayın.

  • securityDomain : Yalnızca bir SWF dosyası (görüntü değil) yüklerken bu özelliği kullanın. Loader nesnesini içeren dosyanın etki alanı dışındaki bir etki alanında bulunan SWF dosyası için bunu belirtin. Bu seçeneği belirttiğinizde, Flash Player, ilke dosyasının var olup olmadığını kontrol eder ve varsa, çapraz ilke dosyasında izin verilen etki alanlarında bulunan SWF dosyaları, yüklenen SWF içeriğinin çapraz komut dosyasını oluşturabilir. Bu parametre için flash.system.SecurityDomain.currentDomain belirtebilirsiniz.

  • applicationDomain : Yalnızca ActionScript 3.0'da yazılmış bir SWF dosyası (ActionScript 1.0 veya 2.0'da yazılmış bir görüntü ya da SWF dosyası değil) yüklenirken bu özelliği kullanın. Dosyayı yüklerken applicationDomain parametresini flash.system.ApplicationDomain.currentDomain öğesine ayarlayarak, dosyanın Loader nesnesinin etki alanıyla aynı uygulama etki alanında bulunacağını belirtebilirsiniz Yüklenen SWF dosyasını aynı uygulama etki alanına koyarak, doğrudan sınıflarına erişebilirsiniz. İlişkilendirilebilir sınıf adları üzerinden erişebileceğiniz, gömülü medya içeren bir SWF dosyası yüklüyorsanız bu kullanışlı olabilir. Ayrıntılı bilgi için bkz. Uygulama etki alanlarıyla çalışma .

Aşağıda, başka bir etki alanından bitmap yüklenirken ilke dosyasının denetlenmesine yönelik bir örnek yer almaktadır:

var context:LoaderContext = new LoaderContext(); 
context.checkPolicyFile = true; 
var urlReq:URLRequest = new URLRequest("http://www.[your_domain_here].com/photo11.jpg"); 
var ldr:Loader = new Loader(); 
ldr.load(urlReq, context);

Aşağıda, dosyayı Loader nesnesiyle aynı güvenlik sanal alanına yerleştirmek için başka bir etki alanından SWF yüklenirken ilke dosyasının denetlenmesine yönelik bir örnek yer almaktadır. Ayrıca kod, yüklenen SWF dosyasındaki sınıfları, Loader nesnesinin etki alanıyla aynı uygulama etki alanına ekler:

var context:LoaderContext = new LoaderContext(); 
context.securityDomain = SecurityDomain.currentDomain; 
context.applicationDomain = ApplicationDomain.currentDomain; 
var urlReq:URLRequest = new URLRequest("http://www.[your_domain_here].com/library.swf"); 
var ldr:Loader = new Loader(); 
ldr.load(urlReq, context);

Daha fazla bilgi için Adobe Flash Platformu için ActionScript 3.0 Başvurusu 'nda bulunan LoaderContext sınıfına bakın.

AIR for iOS'ta SWF dosyalarını yükleme

iOS aygıtlarında, çalışma zamanında kod yükleme ve derleme konusunda kısıtlamalar bulunur. Bu kısıtlamalar nedeniyle, harici SWF dosyalarının uygulamanıza yüklenmesi görevinde bazı gerekli farklılıklar bulunur:

  • ActionScript kodu içeren tüm SWF dosyaları uygulama paketinde olmalıdır. Kod içeren hiçbir SWF, harici bir kaynaktan (örn. bir ağ üzerinden) yüklenemez. Uygulamayı paketlemenin bir parçası olarak, uygulama paketindeki tüm SWF dosyalarında bulunan ActionScript kodlarının tamamı, iOS aygıtları için yerel kod olarak derlenir.

  • Bir SWF dosyasını yükleyip kaldırdıktan sonra yeniden yükleyemezsiniz. Bunu yapmaya çalışırsanız bir hata oluşur.

  • Belleğe yüklenip ardından kaldırılması davranışı masaüstü platformlardaki ile aynıdır. Bir SWF dosyasını yükleyip ardından kaldırırsanız, bu SWF dosyasında bulunan tüm görsel varlıklar bellekten kaldırılır. Ancak, yüklü SWF'deki ActionScript sınıfına yönelik tüm sınıf başvuruları bellekte kalır ve bunlara ActionScript kodunda erişilebilir.

  • Yüklü tüm SWF dosyaları, ana SWF dosyası ile aynı uygulama etki alanına yüklenmelidir. Bu, varsayılan davranış olmadığından, yüklediğiniz her bir SWF için, ana uygulama etki alanını belirten bir LoaderContext nesnesi oluşturmalı ve söz konusu LoaderContext nesnesini Loader.load() yöntem çağrısına iletmelisiniz. Ana SWF uygulama etki alanından farklı bir uygulama etki alanına SWF yüklemeye çalışırsanız bir hata oluşur. Yüklü SWF'de yalnızca görsel varlıklar bulunuyor ve hiçbir ActionScript kodu bulunmuyor olsa da bu true değerine sahiptir.

    Aşağıdaki örnekte, uygulama paketindeki bir SWF'nin ana SWF uygulama etki alanına yüklenmesi için kullanılacak kod gösterilmektedir:

    var loader:Loader = new Loader(); 
    var url:URLRequest = new URLRequest("swfs/SecondarySwf.swf"); 
    var loaderContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain, null); 
    loader.load(url, loaderContext);

Yalnızca varlıklar içeren, hiçbir kod içermeyen bir SWF dosyası uygulama paketinden veya bir ağ üzerinden yüklenebilir. Her iki durumda da SWF dosyasının ana uygulama etki alanına yüklenmesi gerekir.

AIR 3.6'dan önceki AIR sürümleri için tüm kodlar, derleme süreci sırasında ana uygulama SWF'sinin dışındaki SWF'lerden kaldırılır. Yalnızca görsel varlıklar içeren SWF dosyaları uygulama paketine eklenebilir ve çalışma zamanında yüklenebilir. Ancak bu durum kod için söz konusu değildir. ActionScript kodu içeren bir SWF yüklemeye çalışırsanız bir hata oluşur. Bu hata, uygulamada bir “Derlenmeyen ActionScript” hatası iletişim kutusu görünmesine neden olur.

Ayrıca bkz.

Packaging and loading multiple SWFs in AIR apps on iOS (iOS'ta birden fazla SWF paketleme ve AIR'e yükleme)

ProLoader ve ProLoaderInfo sınıflarını kullanma

Uzak paylaşılan kütüphane (RSL) önyüklemesine yardımcı olmak için Flash Professional CS5.5 fl.display.ProLoader ve fl.display.ProLoaderInfo sınıflarını sunar. Bu sınıflar, flash.display.Loader ve flash.display.LoaderInfo sınıflarını yansıtır, ancak daha tutarlı bir yükleme deneyimi sağlar.

Özellikle, ProLoader sınıfı RSL önyüklemesine sahip Metin Mizanpajı Çerçevesi (TLF) kullanan SWF dosyalarını yüklemenize yardımcı olur. Çalışma zamanında, TLF gibi diğer SWF dosyalarını veya SWZ dosyalarını önyükleyen SWF dosyaları, yalnızca dahili olan SWF sarıcı dosyası gerektirir. SWF sarıcı dosyası tarafından uygulanan ekstra karmaşıklık katmanı, istenmeyen davranışlara neden olabilir. ProLoader, bu dosyaları normal SWF dosyalarıymış gibi yüklemek için bu karmaşıklığı çözer. ProLoader sınıfı tarafından kullanılan çözüm kullanıcı tarafından görülebilir ve ActionScript'te özel işlem gerektirmez. Ek olarak, ProLoader normal SWF içeriğini düzgün bir şekilde yükler.

Flash Professional CS5.5 ve üstünde, Loader sınıfının tüm kullanımlarını ProLoader sınıfı ile güvenli bir şekilde değiştirebilirsiniz. Ardından, ProLoader sınıfının gerekli ActionScript işlevselliğine erişebilmesini sağlamak için uygulamanızı Flash Player 10.2 veya üstüne dışa aktarın. Ayrıca, ProLoader sınıfını Flash Player'ın ActionScript 3.0'ı destekleyen önceki sürümlerini hedef alırken de kullanabilirsiniz. Ancak, ProLoader özelliklerinden yalnızca Flash Player 10.2 veya üstünde tam olarak faydalanabilirsiniz. Flash Professional veya üstünde TLF kullanırken her zaman ProLoader sınıfını kullanın. ProLoader'a Flash Professional dışındaki ortamlarda ihtiyaç yoktur.

Önemli: Flash Professional CS5.5 ve üstünde yayınlanan SWF dosyaları için her zaman flash.display.Loader ve flash.display.LoaderInfo sınıfları yerine fl.display.ProLoader ve fl.display.ProLoaderInfo sınıflarını kullanabilirsiniz.

ProLoader sınıfı tarafından ele alınan sorunlar

ProLoader sınıfı, eski Loader sınıfının işlemek üzere tasarlanmadığı sorunlarla ilgilenir. Bu sorunlar TLF kütüphanelerinin RSL önyüklemesinden kaynaklanır. Özellikle, diğer SWF dosyalarını yüklemek için bir Loader nesnesi kullanan SWF dosyaları için geçerlidir. Ele alınan sorunlar şunları içerir:

  • Yükleyen dosya ve yüklenen dosya arasındaki komut dosyası beklendiği şekilde davranmaz. ProLoader sınıfı yükleyen SWF dosyasını otomatik olarak yüklenen SWF dosyasının üst öğesi olarak ayarlar. Bu nedenle, yükleyen SWF dosyasındaki iletişim bilgileri doğrudan yüklenen SWF dosyasına gider.

  • SWF uygulaması yükleme sürecini etkin bir şekilde yönetmelidir. Bunu gerçekleştirmek added , removed , addedToStage ve removedFromStage olayları gibi ek olayların uygulanmasını gerektirir. Uygulamanız Flash Player 10.2 veya daha üstünü hedefliyorsa, ProLoader bu ekstra işleme olan ihtiyacı ortadan kaldırır.

Kodu Loader yerine ProLoader'ı kullanacak şekilde güncelleme

ProLoader sınıfı Loader sınıfını yansıttığından kodunuzda iki sınıf arasında kolaylıkla geçiş yapabilirsiniz. Şu örnek varolan kodun yeni sınıfı kullanmak üzere nasıl güncelleneceğini gösterir:

import flash.display.Loader; 
import flash.events.Event; 
var l:Loader = new Loader(); 
 
addChild(l); 
l.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete); 
l.load("my.swf"); 
function loadComplete(e:Event) { 
    trace('load complete!'); 
}

Bu kod ProLoader sınıfını kullanmak üzere aşağıdaki şekilde güncellenebilir:

import fl.display.ProLoader; 
import flash.events.Event; 
var l:ProLoader = new ProLoader(); 
 
addChild(l); 
l.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete); 
l.load("my.swf"); 
function loadComplete(e:Event) { 
    trace('load complete!'); 
}