Jan 25 2009

AS3 Info Box Class

Category: BoxHadi Tavakoli @ 12:41 am

If you have read the previous posts, you know that we are trying to build a drop down menu and till here we have the scrollbar ready. and as you know we need a container for our items which are going to be placed under the drop down menu. so we here we create a Box class which enables us input three different parameters in it. Of course we are going to make the box in a way which the parameter are optional so in result we can have different kinds of Box instances which all may look different when we change the input.

we need a class which itself can be used as a MovieClip so we will make sure to extend the MovieClip class. I thought that it's not always a good idea to create dynamic classes through library and reference them via new class()  as little by little they can make our code dirty, so wherever we can create classes which they can act as a movieclip or something, it would be better to just extend it.

Alright, for our box to appear on the stage, we will use the follwoing.


		  
		  
		  
		  
		  
		  
		

myBox.floorWidth > will be used to set our box's width
myBox.floorHeight > will be used to set our box's height
myBox.font > will be used as our font but remember to create an empty dynamic text object and place it somewhere off the stage and embed the characters you would need in it. You need to do this because in the class later you will see that we will embed the fonts. (Some where I read that it is possible to embed fonts dynamically into classes which was not possible in SA2. I will look into that later as it will be another nice improvements in AS3)
myBox.fontSize > This will be the size of our fonts in the Box
myBox.fontColor > This will be the color of our fonts
myBox.addInfo({}); > I like this part a lot! as we can call the addInfo method within the Box class and add our information to it easily as you can see the sample above. Note that we want our Box class to accept optional features so if we insert "--" for the object values, it will simply ignore it which in result you can have a Box with thumbnails and label and details all available or just a label :) you can find the final look of our box below.

Notice that we have added no mouse events because OOP is telling us not to make the classes very complicated. so we will just have a box which shows the input. later if we needed a Box which should do something on a click or something, then we can nicely extend our current Box and add listeners to the new sub class.

And here is the Box class below.


		  
		  
		  
		  
		  
		  
		

As you see, in this class I have learned how to deal with a couple of important functionalities like TextField and Loader which I try to give some brief explanation on them.

 

How to use the text class

first you need to import the necessary classes.

import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
import flash.text.AntiAliasType;

then, introduce your variable in the class block  which will later hold your string.

protected var myLable:TextField;
protected var myFormat:TextFormat = new TextFormat();

Note that in this example, "myLable" will hold our text string later and myFormat will hold all the necessary properties for the style of our text.

After that you should start the text field class by calling new TextField(); and set any different settings you want for the text field (This is NOT the style of your text but the properties of the text field itself)

myLable = new TextField();
myLable.antiAliasType = AntiAliasType.ADVANCED;
myLable.autoSize = TextFieldAutoSize.LEFT;
myLable.embedFonts = true;
myLable.mouseEnabled = false;

There are a lot more properties for text fields that I'm sure you can easily find the list in flash's help documents, but here I have mentioned just the properties that I needed to set in my Box class. so feel free to play around with different properties, I assure you that it's will be fun :)

OK, after you have your text field set, you need to set the format (or the styling of your text) ready.

myFormat.font = _font; // "Tahoma"
myFormat.size = _fontSize; // 11
myFormat.color = _fontColor; // 0x000000

After you set the text field and the format ready, it will be the time to link these two objects together like this.

myLable.defaultTextFormat = myFormat;

You're almost done, now insert your string in plain string or html like this.

myLable.text = "my first text!";
myLable.htmlText = "my <b>first</b> text";

 

That's it, I remember a couple of years ago when I was learning AS2 and found about how text fields are organized, I used to say why we should do a lot of work to display a simple text?! well, these things are necessary, every piece of them are necessary. Computers are dumb, we need to tell them every details :)

And by the way, please note how differently AS3 treats the auto size thing... I'm not going to talk about the details here, I'm sure you will find a lot of detailed articles talking about other small things here and there, here you just understood how to make a text field appear on your flash movie. If you found something nice with it, make sure to let me know though! :)

Anyway, there will be a lot of talks about text fields later as in our application we are going to do a lot of crazy things with the text fields.

Regards,
Hadi

Tags: , , , , , , , , , ,


Jan 23 2009

AS3 Creating Custom Event Listeners

Category: ClassesHadi Tavakoli @ 8:50 pm

Maybe you have heard a lot about creating custom listeners, well, doing this is very easy in AS3 now! At least it will look simple when you figure out how! But from my personal experience, I don't think it would be a good idea on some occasions. first let's see how the custom listeners will be created using dispatchEvent Here is what I was going to do initially (I changed my mind later!). I was trying to build a class for loading external files into our movie so it will make the job easier without forcing me to deal with the Loader and URLRequest classes each time. I was hoping on creating a class where I can simply load something like this:

var myImageLoader:ImageLoader = new ImageLoader("00.jpg", this); 

so I wrote the class like below considering all the different listeners that you may want to deal with when loading an external file.


		  
		  
		  
		  
		  
		  
		

As you see, we get the input as one url which will be the address of the file to be loaded and a movieclip target where we want to place the loaded content to. I have used the good dispatchEvent event to create custom listeners with a new name so it enables me to create new listeners. and I could use the new listeners like below


		  
		  
		  
		  
		  
		  
		

Very nice and clean idea you might think, yeah? OK, I used to agree with this too, but nope, forget about it! :( let me get you to the point quickly, Your custom ProgressEvent will NOT work! I'm not sure if it's right to say this for sure, but I tested this in different ways for a thousand times, but it simply won't work and will just send it's properties, bytesTotal and bytesLoaded always zero "0"! which makes it impossible to build any preloader using your custom listener! I also tried digging in the web but I didn't manage to find any article or anything talking about this little issue. Maybe it's a possible bug in AS3 and how dispatchEvent works? I really don't know. I hope someone can give some idea about this. but anyway, in my case, I don't have time to spend more time on this! So I decided to create a function for this reason and pass parameters of whatever I wish to load into the function directly and use the listeners directly. Oh, don't take this wrong, other custom listeners will work just fine and the problem seems to be with the ProgressEvent only. so if you are not going to use the progress event, you will still be able to create your own custom listeners in a separated class. But I personally rather create a function now as it will help me out of the headache at least. if anyone has a better experience with this, please do let me know. I'm going to get back to my Box class and clean it up with an almost stand alone function for taking care of the loading process of external files. hmm, I don't feel satisfied with having to do it with a function in every class I may need something to load... but I have to do this until I find a work around the problem.  

Problem Solved!

January 25th, 2009
ok, I need to edit my post and correct the ImageLoader class we had built before. Below will be the correct class as in my last post I didn't sent the necessary information via dispatchEvent! So there's NO bug with ProgressEvent :) I was just an idiot not to fining the right answer.


		  
		  
		  
		  
		  
		  
		

The only unsolved question in my mind are bubbles and cancelable which I see them a lot of places but can't understand what they mean exactly yet. I will post an article when I did. Anyhow, I think it's a good idea now to use the ImageLoader class because soon we need to create some extended classes from this ImageLoader to load images in Bitmaps... Regards, Hadi

post updated on http://www.emstris.com/2009/02/custom-event-listener-final/

Tags: , , , , , , ,