When working on mobile with AIR you cab use the
logcat tool available in the Andorid SDK to grab information from the device and dumping them via USB on a log screen.
If you are interested to get only the trace statements and the ActionScript error messages you can restict the logcat output via command line with the snippet you find below.
The reason why you can do this filtering is because during the packaging process each AIR application has the word
air added to the application ID, therefore using the filter I.air guarantees to dump all messages for the currently running AIR application.
The letter
I stays for the
Information priority level.
androidSDK/platform-tools/adb logcat|grep "I.air"
To use a custom component as a statusbar it's quiet easy,
just create your component using MXML or Actionscript, it's the same, and the add this line to your WindowedApplication
statusBarFactory="{new ClassFactory(MyCustomStatusBar)}"
Load and use embedded fonts at run-time.
/**
* Prepare font bundle SWF with embedded fonts.
*/
[Embed(source='../assets/Anonymous Pro B.ttf', fontName='AnonymousProB', fontWeight='bold', fontStyle='normal', mimeType='application/x-font', advancedAntiAliasing='true')]
public static var AnonymousProB:Class;
[Embed(source='../assets/Anonymous Pro BI.ttf', fontName='AnonymousProBI', fontWeight='bold', fontStyle='italic', mimeType='application/x-font', advancedAntiAliasing='true')]
public static var AnonymousProBI:Class;
[Embed(source='../assets/Anonymous Pro I.ttf', fontName='AnonymousProI', fontWeight='normal', fontStyle='italic', mimeType='application/x-font', advancedAntiAliasing='true')]
public static var AnonymousProI:Class;
[Embed(source='../assets/Anonymous Pro.ttf', fontName='AnonymousPro', fontWeight='normal', fontStyle='normal', mimeType='application/x-font', advancedAntiAliasing='true')]
public static var AnonymousPro:Class;
/**
* Load the bundle using Loader.
*/
protected function loadFonts():void {
var urlRequest:URLRequest = new URLRequest("fonts/FontBundle.swf");
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete);
var loaderContext:LoaderContext = new LoaderContext();
loaderContext.allowLoadBytesCodeExecution = true;
loaderContext.applicationDomain = ApplicationDomain.currentDomain;
loader.load(urlRequest, loaderContext);
}
/**
* Register fonts and render the text field.
*/
protected function onLoaderComplete(event:Event):void {
var FontBundle:Class = ApplicationDomain.currentDomain.getDefinition("FontBundle") as Class;
Font.registerFont(FontBundle.AnonymousProB);
Font.registerFont(FontBundle.AnonymousProBI);
Font.registerFont(FontBundle.AnonymousProI);
Font.registerFont(FontBundle.AnonymousPro);
var AnonymousProBI:Class = FontBundle.AnonymousProBI;
var font:Font = new AnonymousProBI() as Font;
var textFormat:TextFormat = new TextFormat();
textFormat.font = font.fontName;
textFormat.size = 35;
var textField:TextField = new TextField();
textField.autoSize = TextFieldAutoSize.LEFT;
textField.defaultTextFormat = textFormat;
textField.antiAliasType = AntiAliasType.ADVANCED;
textField.embedFonts = true;
textField.multiline = true;
textField.rotation = 45;
textField.text = "The quick brown fox jumps over the lazy dog." + "\n" + new Date().toTimeString();
textField.width = 400;
textField.wordWrap = true;
textField.x = 100;
textField.y = 100;
addChild(textField);
}
The following example shows you how to extends the ProgrammaticSkin and add an image as background of your WindowedApplication positioned at the center of the window;
usage :
WindowedApplication {
borderSkin: ClassReference("com.gnstudio.skins.ApplicationSkin");
}
package com.gnstudio.skins
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.Event;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle;
import mx.controls.Image;
import mx.skins.ProgrammaticSkin;
public class ApplicationSkin extends ProgrammaticSkin{
[Embed(source="skin/application/bckg.jpg")]
private var imageClass:Class
private var _image:Bitmap;
private var _bitmapData:BitmapData;
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void{
super.updateDisplayList(unscaledWidth, unscaledHeight);
var backgroundColor:uint = getStyle("backgroundColor");
if(!_image){
_image = new imageClass()
_bitmapData = new BitmapData(_image.width, _image.height);
var matrix:Matrix = new Matrix();
_bitmapData.draw(_image,matrix);
}
if(unscaledWidth && unscaledWidth){
graphics.clear();
graphics.beginFill(backgroundColor);
graphics.drawRect(0, 0, unscaledWidth,unscaledHeight);
graphics.endFill();
var x:Number = unscaledWidth/2 - _bitmapData.width/2;
var y:Number = unscaledHeight/2 - _bitmapData.height/2;
var bd:BitmapData = new BitmapData(unscaledWidth,unscaledHeight,true,backgroundColor);
bd.copyPixels(_bitmapData,new Rectangle(0,0,_bitmapData.width,_bitmapData.height),new Point(x,y));
graphics.beginBitmapFill(bd, new Matrix(), false, true);
graphics.drawRect(x, y, _bitmapData.width, _bitmapData.height);
}
}
}
}
The following example shows how you can set the initial directory for the Adobe AIR FileSystemTree control by setting the directory property to a File object, which in this case is the user documents direcotry.
<mx:FileSystemTree id="tree"
directory="{File.documentsDirectory}"
width="100%" height="100%" />
I was looking to a way to dispatch events between ultiple windows in an AIR application and, after I found on google only some solution that state to send a reference of the target for the event to the new window uing public properties, I came out with a more elegant solution that involves a new class added to nabiro.
The idea is that this class acts like a bridge on which is possible to register a DisplayObjetc for a specific message (i.e. the event type), the snippet represent only the simple usage of thebridge for register a new DisplayObject, attached there is the complete sample.
bridge = WindowsBridge.getInstance();
bridge.register(this, "Test");
addEventListener("Test", onTest);
// Window dispatch code
var test:WindowsBridge = WindowsBridge.getInstance();
test.dispatchEvent(new IntraWinComEvent(IntraWinComEvent.DEFAULT, new Event("Test")));