Membuat Image Slider
Tutorial kali ini adalah tentang pembuatan aplikasi Image Slider untuk menampilkan sekumpulan gambar secara dinamis dengan menggunakan ActionScript 3.0.
Kalau Anda ingin mengikuti step-by-step, silaken donlod file berikut ini: ImageSlider_starter.tar.gz
Hasil akhirnya bisa didonlod di sini : ImageSlider_final.tar.gz
Starter Files
Ekstrak imageslider_starter.tar.gz. Di dalamnya ada sebuah file .fla bernama ImageSlider, Main.as, dan sebuah folder berisi beberapa gambar dengan nama file 1.jpg, …, 8.jpg. Gambar-gambar ini yang akan kita muat ke dalam aplikasi. Kenapa saya menamai file-file tersebut dgn angka? Alasannya hanya satu, untuk menyederhanakan tutorial ini.
Buka file ImageSlider.fla. Di Stage sudah ada beberapa object yaitu :
- imageContainer ( movieclip )
- info_txt (dynamic textfield )
- nextButton (simplebutton )
- prevButton (simplebutton)
nextButton dan prevButton adalah 2 buah instance dari satu simbol yang sama yaitu “nav button”. Simbol ini bertipe SimpleButton dan memiliki 3 tampilan berbeda untuk state up, over, dan down.
Nggak ada yg spesial sampai di sini.
Document Class
AS3 tidak mengenal statemen include, jadi untuk membuat skrip eksternal kita harus membuat sebuah Document class . Silakan klik bagian kosong di Stage dan lihat Property Panel. Pada field Document _class (Gambar 1), isikan “Main” (tanpa tanda kutip). “Main” ini adalah nama class yang “mewakili” dokumen .fla yg kita buat. Dalam file inilah nanti kita menulis semua skrip.
Kenapa saya pakai file eksternal dan bukan menulis skrip langsung pada timeline? Jawabannya adalah : Editor actionscript yg dimiliki Flash IDE adalah editor paling bodoh yang pernah saya temui. Dengan menuliskan skrip dalam file eksternal, saya bisa menggunakan editor lain yg jauh lebih cerdas. Favorit saya adalah FlashDevelop dan ini yg selalu saya gunakan.
Sebelum kita mulai menulis skrip ada satu hal lain yg perlu kita ubah. Buka panel “Publish Settings”, klik tab “Flash”, lalu klik tombol “setting di sebelah kanan ActionScript3” (Gambar 2). Hilangkan tanda centang pada bagian “Automatically declare stage instances” (Gambar 3).
Dengan menghilangkan tanda centang pada gambar 3 di atas, berarti kita harus mendeklarasikan semua object yang ada di Stage sebagai public var dalam Document Class. Memang sedikit merepotkan, tapi dengan begini Document Class yang kita buat akan lebih mudah dibaca .
Main.as
Oke, sekarang kita buka file Main.as. Di dalamnya sudah ada skrip berikut.
- package {
- import flash.display.*;
- import flash.net.URLRequest;
- import flash.text.*;
- import flash.events.*;
- public class Main extends Sprite{
- public var imageContainer:MovieClip;
- public var info_txt:TextField;
- public var nextButton:SimpleButton;
- public var prevButton:SimpleButton;
- public function Main() {
- init();
- }
- private function init():void {
- }
- }
- }
Lihat bagian 4 buah public var di atas. Nama variabelnya sama dengan nama instance object yang ada di Stage. Tipe datanya sama dengan tipe data masing-masing object.
Catatan – Kalau kita tidak menghilangkan tanda centang pada “Automatically declare stage instance”, keempat variabel ini tidak boleh kita deklarasikan lagi.
Pada bagian constructor yaitu Main() , hanya ada satu baris kode yaitu pemanggilan terhadap init() dimana semua proses inisialisasi akan dilakukan.
Instance Variables
Selanjutnya, kita butuh beberapa instance variable sebagai berikut:
- private var _baseURL:String;
- private var _fileExt:String;
- private var _lastID:uint;
- private var _firstID:uint;
- private var _numImages:uint;
- private var _curImageID:uint;
- private var _imageLoader:Loader;
- private var _image:Bitmap;
Value dari masing-masing variabel di atas adalah:
- _baseURL : url dari direktori yang berisi gambar
- _fileExt : ekstensi file gambar
- _lastID : nama file terakhir yang ingin ditampilkan
- _firstID : nama file pertama yg ingin ditampilkan
- _numImages: banyaknya gambar
- _curImageID : nama file gambar yang sedang ditampilkan
- _imageLoader : nama object Loader yang akan kita gunakan untuk memuat gambar
- _image : Bitmap object untuk menampung gambar yang dimuat oleh _imageLoader
Inisialisasi variabel di atas dilakukan dalam init() , kecuali untuk variabel _curImageID, _imageLoader, dan _image. Kita inisialisasi variabel sebagai berikut :
_baseURL = “gambar”
_fileExt = “jpg”
_lastID = 6
_firstID = 2
_numImages = _lastID – _firstID + 1
Function loadImage()
Function loadImage() adalah function yang akan kita gunakan untuk memuat gambar. Function ini memiliki satu parameter yaitu id dengan tipe data String.
Dalam function ini kita buat sebuah object bernama “request” dgn tipe data flash.net.URLRequest. Properti yang paling penting dari object ini adalah properti url yang, sesuai dengan namanya, kita gunakan untuk menampung alamat/url sebuah resource eksternal.
Untuk memuat sebuah file eksternal secara dinamis, kita gunakan Loader class ( dalam AS3 tidak ada lagi loadMovie(), loadMovieNum(), dan MovieClipLoader ) .
- private function loadImage(id:uint):void {
- //simpan id dari image yang ditampilkan
- _curImageID = id;
- //buat objek URLRequest
- var request:URLRequest = new URLRequest();
- //isi properti url dengan alamat gambar yg akan ditampilkan
- request.url = _baseURL +"/" + String(id) + "." + _fileExt;
- //buat objek Loader
- _imageLoader = new Loader();
- //daftarkan listener untuk Event.INIT
- _imageLoader.contentLoaderInfo.addEventListener(Event.INIT, loadInitListener);
- //daftarkan listener untuk ProgressEvent.PROGRESS
- _imageLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loadProgressListener);
- //daftarkan listener untuk IOErrorEvent.IO_ERROR
- _imageLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, loadErrorListener);
- //load gambar yang dimaksud
- _imageLoader.load(request);
- }
Dalam listing di atas, kita daftarkan listener untuk 3 buah event yang di-broadcast oleh _imageLoader yaitu:
- Event.INIT : event pada saat gambar siap ditampilkan di stage
- ProgressEvent.PROGRESS : event yang dibroadcast selama proses loading
- IOErrorEvent.IO_ERROR : event pada saat proses loading gagal
Untuk menangani ketiga event ini kita buat 3 buah function yaitu :
- private function loadInitListener(e:Event):void {
- //simpan gambar yang telah dimuat oleh _imageLoader
- _image = Bitmap(_imageLoader.content);
- //tambahkan ke dalam DisplayList sebagai child dari
- //imageContainer
- imageContainer.addChild(_image);
- //hapus image sebelumnya dari
- //daftar children imageContainer
- imageContainer.removeChildAt(imageContainer.getChildIndex(_image) - 1);
- //isi info_txt dengan informasi
- //gambar ke ... dari total gambar
- info_txt.text = _curImageID-_firstID+1 +"/" + _numImages;
- }
- private function loadProgressListener(e:ProgressEvent):void {
- //variabel untuk menyimpan persentase byte yang
- //sudah di download
- var pct:Number = e.bytesLoaded / e.bytesTotal * 100;
- //tampilkan load progress pada info_txt
- info_txt.text = "loading image " + pct.toFixed(0)+"%";
- }
- private function loadErrorListener(e:IOErrorEvent):void {
- //jika terjadi error, tampilkan pesan ini
- info_txt.text = "Unable to load image";
- }
Button Events
Kembali ke function init(), kita daftarkan listener untuk prevBtn dan nextBtn. Listener adalah function yang akan dieksekusi ketika sebuah event terjadi, dalam hal ini MouseEvent.CLICK. Event ini akan “disiarkan” (broadcasted) pada saat sebuah Interactive Object di-klik.
- prevButton.addEventListener(MouseEvent.CLICK, prevBtnListener);
- nextButton.addEventListener(MouseEvent.CLICK, nextBtnListener);
Sehingga function init() menjadi :
- private function init():void {
- _baseURL = "gambar";
- _fileExt = "jpg";
- _lastID = 6;
- _firstID = 2;
- _numImages = _lastID - _firstID + 1;
- prevButton.addEventListener(MouseEvent.CLICK, prevBtnListener);
- nextButton.addEventListener(MouseEvent.CLICK, nextBtnListener);
- }
Kita buat dua buah function untuk menangani button events di atas:
- private function nextBtnListener(e:MouseEvent):void {
- //jika proses loading sedang berjalan,
- //batalkan proses itu
- if(isLoading) closeStream();
- //load gambar berikutnya
- loadImage(getNextImage());
- }
- private function prevBtnListener(e:MouseEvent):void {
- //jika proses loading sedang berjalan,
- //batalkan proses itu
- if(isLoading) closeStream();
- //load gambar sebelumnya
- loadImage(getPrevImage());
- }
- private function getNextImage():uint {
- //jika gambar yang sedang ditampilkan
- //bukan gambar terakhir,
- //isi variabel next dengan ID gambar berikutnya
- //tapi jika gambar yg sedang ditampilkan
- //adalah gambar terakhir,
- //isi next dengan ID gambar pertama
- var next:uint = (_curImageID < _lastID ) ? _curImageID+1 : _firstID ;
- return next;
- }
- private function getPrevImage():uint {
- //jika gambar yang sedang ditampilkan
- //bukan gambar pertama,
- //isi variabel prev dengan ID gambar sebelumnya
- //tapi jika gambar yg sedang ditampilkan
- //adalah gambar pertama,
- //isi prev dengan ID gambar terakhir
- var prev:uint = (_curImageID > _firstID ) ? _curImageID-1 : _lastID;
- return prev;
- };
- private function closeStream():void {
- //batalkan proses loading
- _imageLoader.close();
- //buang event listener utk Event.INIT
- _imageLoader.contentLoaderInfo.removeEventListener(Event.INIT, loadInitListener);
- }
- private function get isLoading():Boolean {
- //jika _imageLoader sedang melakukan
- //proses loading, b bernilai true
- var b:Boolean = _imageLoader.contentLoaderInfo.bytesLoaded < _imageLoader.contentLoaderInfo.bytesTotal;
- return b;
- }
Terakhir, panggil loadImage() dari function init(). Isi argumennya dengan _firstID untuk memuat gambar pertama; loadImage(_firstID).
Main.as selengkapnya:
- package {
- import flash.display.*;
- import flash.net.URLRequest;
- import flash.text.*;
- import flash.events.*;
- public class Main extends Sprite{
- public var imageContainer:MovieClip;
- public var info_txt:TextField;
- public var nextButton:SimpleButton;
- public var prevButton:SimpleButton;
- private var _baseURL:String;
- private var _fileExt:String
- private var _lastID:uint;
- private var _firstID:uint;
- private var _numImages:uint;
- private var _curImageID:uint;
- private var _image:Bitmap;
- private var _imageLoader:Loader;
- public function Main() {
- init();
- }
- private function init():void {
- _baseURL = "gambar";
- _fileExt = "jpg";
- _lastID = 6;
- _firstID = 2;
- _numImages = _lastID - _firstID + 1;
- prevButton.addEventListener(MouseEvent.CLICK, prevBtnListener);
- nextButton.addEventListener(MouseEvent.CLICK, nextBtnListener);
- loadImage(_firstID);
- }
- private function loadImage(id:uint):void {
- _curImageID = id;
- var request:URLRequest = new URLRequest();
- request.url = _baseURL +"/" + String(id) + "." + _fileExt;
- _imageLoader = new Loader();
- _imageLoader.contentLoaderInfo.addEventListener(Event.INIT, loadInitListener);
- _imageLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loadProgressListener);
- _imageLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, loadErrorListener);
- _imageLoader.load(request);
- }
- private function getNextImage():uint {
- var next:uint = (_curImageID < _lastID ) ? _curImageID+1 : _firstID ;
- return next;
- }
- private function getPrevImage():uint {
- var prev:uint = (_curImageID > _firstID ) ? _curImageID-1 : _lastID;
- return prev;
- }
- private function nextBtnListener(e:MouseEvent):void {
- if(isLoading) closeStream();
- loadImage(getNextImage());
- }
- private function prevBtnListener(e:MouseEvent):void {
- if(isLoading) closeStream();
- loadImage(getPrevImage());
- }
- private function loadInitListener(e:Event):void {
- _image = Bitmap(_imageLoader.content);
- imageContainer.addChild(_image);
- imageContainer.removeChildAt(imageContainer.getChildIndex(_image) - 1);
- info_txt.text = _curImageID-_firstID+1 +"/" + _numImages;
- }
- private function loadProgressListener(e:ProgressEvent):void {
- var pct:Number = e.bytesLoaded / e.bytesTotal * 100;
- info_txt.text = "loading image " + pct.toFixed(0)+"%";
- }
- private function loadErrorListener(e:IOErrorEvent):void {
- info_txt.text = "Unable to load image";
- }
- private function closeStream():void {
- _imageLoader.close();
- _imageLoader.contentLoaderInfo.removeEventListener(Event.INIT, loadInitListener);
- }
- private function get isLoading():Boolean {
- var b:Boolean = _imageLoader.contentLoaderInfo.bytesLoaded < _imageLoader.contentLoaderInfo.bytesTotal;
- return b;
- }
- }
- }
Catatan – Jika ada aplikasi yg Anda buat tidak berjalan dengan semestinya, bandingkan kode yg Anda tulis dengan yang ada di ImageSlider_final.tar.gz.
Selamat mencoba.
Comments [4]
1. Fajar , 359 days ago #
Mas Tutorialnya Bagus… tapi saya ada bbrp pertanyaan buat anda.
1. apakah penjelasan dari “init” yg terdapat di :“public function Main() {
init();{” apakah untuk mendeklarasikan var yg ada…?
2. bagaimana cara penggunaan “Aray” saya menggunakan aray di taruh di Flash IDE, untuk menarik script yg ada di eksternal, ini cthnya:
var aContentClips:Array = new Array(mShop, mSponsor, mAbout, mResource, mContact, mExpedition);
var aButtonClips:Array = new Array(bShop, bSponsor, bAbout, bResource, bContact, bExpedition);
var aLabel:Array = new Array(“SHOP”,“SPONSORS”,“ABOUT”,“RESOURCES”,“CONTACT”,“EXPEDITIONS”);
setUpContent(aContentClips);
setUpButtons(aButtonClips,aLabel);
clearAllContent();
bagaimana caranya kl saya pindahkan ke AS Eksternal ?
3. saya mengikuti saran anda menggunakan FlashDevelop, yg ternyata sangat bagus sekali… tapi apakah ada Versi untuk Mac OS(macintosh)? krn saya mengunakan Macintosh untuk di kantor…
Terima kasih Sebelumnya…
2. anggie bratadinata (author) , 358 days ago #
Fajar,
#1. Ya. Seperti yg sudah saya jelaskan di atas, init adalah function di mana proses inisialisasi dilakukan termasuk pendefinisian instance variabel.
#2. Maaf, lebih tepat kalau Anda memposting pertanyaan itu ke babaforum atau milis babaflash atau milis id-flash.
#3. FD hanya bisa dipake di Windows karena butuh .NET 2.0. Ada alternatif untuk OS yg lain, namanya FDT, berupa plugin untuk Eclipse IDE. Sayangnya FDT nggak gratis, harganya sekitar $200 – 300.
3. andi , 357 days ago #
mau dong bagi fla cara bikin scroll nya, thanks yak
4. Fajar Sylvana , 357 days ago #
ok mas Thx atas jawabannya… BTW Tutorial anda Bgs2 semuanya.
Keep a good works Dude.
Oia Mas.. gak ada niatan bikin Video Tutorial Buat Actionscript 3.0 ?
Commenting is closed for this article.