Adobe Flex

Adobe Flex

Flex中的Base64加解密

Flex sdk3就内置了Base64的加/解密工具类
分别是
mx.utils.Base64Encoder
mx.utils.Base64Decoder

Base64Encoder用法如下:
var $orgin:String = this.textOrigi.text;//获取原始字符串
var $base64:Base64Encoder = new Base64Encoder();
$base64.insertNewLines = false;//该值等于true时,输出的结果会自动换行,默认为true,
$base64.encodeUTFBytes($orgin);//这里注意,如果想加密中文就不要使用$base64.encode();
var $result:String = $base64.toString();//输出结果
Base64Decoder用法如下:
				var $origi:String = this.textEncodeResult.text;//获取原始字符串
				var $base64:Base64Decoder = new Base64Decoder();
				$base64.decode($origi);
				var $result:String = $base64.toByteArray().toString();//输出结果,decode类只能输出ByteArray类型的数据,因此要转换成string
完成代码:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
			   xmlns:s="library://ns.adobe.com/flex/spark"
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">

	<fx:Script>
		<![CDATA[
			import mx.utils.Base64Decoder;
			import mx.utils.Base64Encoder;
			protected function btnEncode_clickHandler(event:MouseEvent):void
			{
				var $orgin:String = this.textOrigi.text;//获取原始字符串
				var $base64:Base64Encoder = new Base64Encoder();
				$base64.insertNewLines = false;//该值等于true时,输出的结果会自动换行,默认为true,
				$base64.encodeUTFBytes($orgin);//这里注意,如果想加密中文就不要使用$base64.encode();
				var $result:String = $base64.toString();//输出结果
				this.textEncodeResult.text = $result
			}

			protected function btnDecode_clickHandler(event:MouseEvent):void
			{
				var $origi:String = this.textEncodeResult.text;//获取原始字符串
				var $base64:Base64Decoder = new Base64Decoder();
				$base64.decode($origi);
				var $result:String = $base64.toByteArray().toString();//输出结果,decode类只能输出ByteArray类型的数据,因此要转换成string
				this.textDecodeResult.text = $result
			}

		]]>
	</fx:Script>

	<mx:Form width="100%">
		<mx:FormItem label="原始字符串:" width="100%">
			<s:TextArea editable="true" id="textOrigi" width="100%" text="在这里输入原始字符串"/>
		</mx:FormItem>
		<mx:FormItem>
			<s:Button id="btnEncode" label="Encode Base64" enabled="{this.textOrigi.text!=''}" click="btnEncode_clickHandler(event)"/>
		</mx:FormItem>
		<mx:FormItem label="Encode 结果:" width="100%">
			<s:TextArea editable="false" id="textEncodeResult" width="100%"/>
		</mx:FormItem>
		<mx:FormItem>
			<s:Button id="btnDecode" enabled="{this.textEncodeResult.text!=''}" label="Decode Base64" click="btnDecode_clickHandler(event)"/>
		</mx:FormItem>
		<mx:FormItem label="Decode 结果:" width="100%">
			<s:TextArea editable="false" id="textDecodeResult" width="100%" text="点击Decode Base64按钮后,这里的结果应该和原始字符串相同"/>
		</mx:FormItem>
	</mx:Form>
</s:Application>

FlexBuilder中使用代码片断工具

1.1 工具介绍

使用代码片断工具,您可以存储内容(文档中重复出现的代码如public function …( ):void{   }等)以便快速重复使用。多种软件都含有此工具(例如Dreamweaver),flexbuilder中此工具包含在CFEclipse插件中。

1.2 安装与使用

安装步骤:

a.  帮助       安装新软件;

b.  使用(W)一栏中输入地址   http://www.cfeclipse.org/update

c.  输入网址后按Enter,程序连接服务器,窗口显示“暂挂中”,连接完毕后窗口会显示出可供安装的程序,选择CFEclipse CFML Editor   点 下一步

d.  点 完成  开始下载   出现安全警告提示软件未签名 点击确定  之后按提示重启flex builder

e.  打开工具窗口(Snip Tree View);

f.   编辑代码片断   新建片断

g.  按钮插入该片断(只适用于AS代码文件)

h.  片断中适用参量:$${    }   如图中代码

在插入该片断时会出现提示框,要求输入$${}标记的参数值name  如图

确定后整段代码被插入

Air/Flex动态加载module及其依赖的RSL

有关Flex和Air中如何使用RSL网上教程很多,google一下即可,这里不多做叙述了

而这次遇到的问题是这样的:

发布时只发布一个主程序(Web或者Air方式),而不发布所需要的module及其依赖的swc,只在运行时根据需要加载module及其依赖的swc

1.       建立一个实验用的module工程:

先准备一个module工程,普通的Flex Project(web)即可,主程序名无所谓,因为这个工程只是为了编译module对象用的

在Properties->Flex Build Path中引入所要依赖的swc,这个例子中使用了TweenLite.swc

注意AIR project的默认Link TypeMerge into code,改成RSL。如图:

新建一个包modules并新建一个module程序:MyModule1.mxml

到Properties->Flex Modules中修改该module的optimize属性为none,如下图

点击Edit按钮,弹出下图

选择Do not optimize(…)

在MyModule1.xml中使用TweenLite做一个简单的动画:

TweenLite.to(<strong>this</strong>.goed,4,{x:500});

编译工程,

此时MyModule1.mxml被编译生成为MyModule1.swf

TweenLite.swc会被编译成TweenLite.swf

复制到要被加载的目录下,我的是

http://127.0.0.1/testflex/TweenLite.swf

http://127.0.0.1/testflex/modules/MyModule1.swf

2.       建立主工程(Flex Web):

新建一个Flex Project(web),不要使用引入TweenLite.swc

新建一个用来控制加载TweenLite的类:

tasks/TaskLoadRSL.as

在这个类中,使用URLLoader将TweenLite.swc从http://127.0.0.1/testflex/TweenLite.swf上加载下来,主要代码如下:

var loader:Loader = new Loader();
var context:LoaderContext = new LoaderContext();
context.applicationDomain = ApplicationDomain.currentDomain;//必须有这一句,RSL必须和主程序在同一个域中
loader.load(new URLRequest(this.web),context);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,localLoadCompleteHandler);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,localLoadIoErrorHandler);

加载完TweenLite后不需要任何操作,直接开始加载module即可

使用IModuleInfo或ModuleLoader加载module都可以,详见源代码

3.       建立主工程 (AIR):

Air中比Flex要麻烦,因为发布时只发布主程序,所以运行时需要先检测本地是否有swc和

module

如果有就直接加载运行(同Web)

如果没有就从网站上下载到本地,然后再加载

主要代码如下:

从网络地址上加载:

var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, loadFromWebCompleteHandler);
loader.addEventListener(IOErrorEvent.IO_ERROR, loadFromWebErrorHandler);
loader.load(new URLRequest(web))

加载完,保存到本地:

var loader:URLLoader = URLLoader($e.target);
var data:ByteArray = ByteArray(loader.data);
var file:File = new File(File.applicationDirectory.resolvePath(this.local).nativePath);
trace('save file to' + file.nativePath);
var fileStream:FileStream = new FileStream();
fileStream.open(file, FileMode.WRITE);
fileStream.writeBytes(data);
fileStream.close();
this.loadFromLocalFile();

本地加载过程同Flex Web

更多内容参加源代码:DynamicTestLoadModuleAndRSL

httpservice request传参数的几种方式

mxml代码中 httpservice 组件,连接一php计算器

<s:Button click="this.hs.send();"/>
<fx:Declarations>
	<s:HTTPService id="hs" url="http://127.0.0.1/cal.php" method="GET">
		<s:request xmlns="">
			<calculator>plus</calculator>
			<param1>10</param1>
			<param2>23</param2>
		</s:request>
		<s:fault>
			<![CDATA[
				trace("")
			]]>
		</s:fault>
		<s:result>
			<![CDATA[
				trace(event.result.result.equals)
			]]>
		</s:result>
	</s:HTTPService>
</fx:Declarations>

httpService组件,在as块中传入参数

var param:Object = {calculator:"minus",param1:"23",param2:"13"}
httpServ.send(param)

<mx:HTTPService id="httpServ">
	<mx:resultFormat>text</mx:resultFormat>
	<mx:url>http://127.0.0.1/cal.php</mx:url>
	<mx:fault>Alert.show(event.toString(), event.type);</mx:fault>
</mx:HTTPService>

as代码中,使用httpservice类

public var httpservice:mx.rpc.http.HTTPService = new mx.rpc.http.HTTPService();
public var param:Object={calculator:"minus",param1:"23",param2:"13"};
public function send_data():void{
	httpservice.url ="http://127.0.0.1/cal.php";
	httpservice.method = "POST";
	httpservice.addEventListener(ResultEvent.RESULT, resultHandler);
	httpservice.addEventListener(FaultEvent.FAULT, this.HttpErrorHandle);
	httpservice.send(param);
		}

as代码中使用urlloader

public function Temp()
		{
			var url:String = "http://127.0.0.1/cal.php"
			var urlVariables:URLVariables = new URLVariables();
			urlVariables.decode("calculator=plus&param1=10&param2=22");
			var request:URLRequest = new URLRequest(url);
			request.data = urlVariables;
			request.method = URLRequestMethod.POST

			var loader:URLLoader = new URLLoader()
			loader.dataFormat = URLLoaderDataFormat.TEXT
			loader.addEventListener(Event.COMPLETE, onComplete)
			loader.load(request);

		}
		public function onlistener(event:Event):void{
			var xml:XML = new XML(event.target.data)

			trace(xml..equals)
		}

偶遇FLEX 4中容器之间复制数据方法

偶遇书上容器之间的复制数据方法。通过拖拽功能实现不同容器间的数据复制,能优化交互功能。小试成功,令闻此方法可能小有用处,故将此方法发于此,方便大家讨论及指正。主要代码如下所示。

在.mxml中添加组件:

<s:HGroup>
<s:HGroup>
<s:Label text="可选专辑" fontSize="14"/>
<mx:DataGrid id="srcgrid" dragEnabled="true" fontSize="12">
<mx:columns>
<mx:DataGridColumn dataField="Artist" headerText="Singer"/>
<mx:DataGridColumn dataField="Album" headerText="Album"/>
<mx:DataGridColumn dataField="Price" headerText="Price"/>
</mx:columns>
</mx:DataGrid>
</s:HGroup>
<s:HGroup>
<s:Label text="已经选购的专辑" fontSize="14"/>
<mx:DataGrid id="destgrid" dropEnabled="true" fontSize="12" dragDrop="destgrid_dragDropHandler(event)">
<mx:columns>
<mx:DataGridColumn dataField="Artist1" headerText="Singer"/>
<mx:DataGridColumn dataField="Album1" headerText="Album"/>
<mx:DataGridColumn dataField="Price1" headerText="Price"/>
</mx:columns>
</mx:DataGrid>
</s:HGroup>
</s:HGroup>

fx:Script中的代码:

protected function application1_creationCompleteHandler(event:FlexEvent):void     //createcomplete函数,为datagrid赋值
{
srcgrid.dataProvider = new ArrayCollection([
{Artist:'English',Album:'Learn',Price:1},
{Artist:'Chinese',Album:'Try',Price:3},
]);
destgrid.dataProvider = new ArrayCollection();
// TODO Auto-generated method stub
}

protected function destgrid_dragDropHandler(event:DragEvent):void     //拖拽时调用的方法
{
if (event.dragSource.hasFormat("items"))
{
event.preventDefault();                         //取消默认行为

//获取拖放的目标对象
var droptarget:DataGrid = DataGrid(event.currentTarget);

//隐藏鼠标下方允许拖放的指示条

droptarget.hideDropFeedback(event);

//获取复制的数据集
var itemsArray:Array = event.dragSource.dataForFormat("items") as Array;

//复制数据
var tempItem:Object = {
Artist1:itemsArray[0].Artist,
Album1:itemsArray[0].Album,
Price1:itemsArray[0].Price
};

//获取拖放的目标对象的位置
var droploc:int = droptarget.calculateDropIndex(event);

IList(droptarget.dataProvider).addItemAt(tempItem,droploc);

}

}

运行效果如下:

AS3中使用Twitter API

自制app使用Twitter API

1.1   准备工作

A.注册Twitter用户

B. 下载库文件http://dev.twitter.com/pages/libraries

本实例使用ActionScript 库文件 TwitterScript http://code.google.com/p/twitterscript/

C. Twitter官方文档 http://dev.twitter.com/doc TwitterScript并无说明文档,Twitter官方的文档和TwitterScript的代码不一致,但不矛盾。

1.2 需求说明

制作AIR程序(图1),实现如下功能

a.  显示当前用户头像,用户名

b.  显示当前用户following   followers

c.  显示当前用户friends Tweet  public Tweet

d.  提交新Tweet,并体现到friends Tweet中

图1 程序界面

1.3编写代码

Twitter数据调用多数需要身份验证,有的是不需要的。

Twitter的身份验证简单,只需将用户名和密码编码后嵌入到实际调用数据的request的requestHeaders中即可(暂不考虑OAuth),不同于facebook须登录后得到session-key才能调用数据。

TwitterScript 中的方法:

类Twitter.as中function setAuthenticationCredentials(“username”,”password”)

此方法只是将用户的名和密码编码,function twitterRequest()负责将编码嵌入到requestHeaders,该嵌入过程被整合到各个具体调用数据的方法中因此编写程序代码时不用考虑此过程

A.制作登录页面,通过TextInput将用户名密码传给程序。(图2)

图2

提示:两个state ,登录界面和程序界面两个界面大小可以不同:代码如

<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
					   xmlns:s="library://ns.adobe.com/flex/spark"
					   xmlns:mx="library://ns.adobe.com/flex/mx" width="800" height="500"
					   currentState="sign_out" width.sign_out="320" height.sign_out="230"
					   width.sign_in="628" height.sign_in="500">

Sign in按钮click=“sign_in( )”

B. 定义sign_in方法,调用数据

var twitter:Twitter = new Twitter()

twitte.setAuthenticationCredentials(usrId.text, passwd.text)

对用户名 密码编码, userId 和 passwd是登录页面两个输入框的ID

twitter.loadInfo(userId.text)

twitter.addEventListener(TwitterEvent.ON_SHOW_INFO, onloadInfo)

调用user信息

twitter.loadFriends(usrId.text)

twitter.addEventListener(TwitterEvent.ON_FRIENDS_RESULT, onloadfriends)

调用user following

twitter.loadFriendsTimeline(userID.text)

twitter.addEventListener(TwitterEvent.ON_FRIENDS_TIMELINE_RESULT, onloadUserTimeLine)

调用friends Tweet

twitter.addEventListener(TwitterEvent.ON_ERROR, onerror)

监听error

C. 处理返回结果。制作程序界面(如图3)

图3

a.显示用户名 头像

loadInfo方法返回的data类型为TwitterUser,包含name ,square url等,处理方法略

b.显示following用户名

loadFriends方法返回TwitterUser的Array

var tmp:Array = event.data as Array

for (var i:int; i<tmp.length; i++){

var user:TwitterUser = tmp[i];

followname.addItem({flwname:user.name})

followname:ArrayCollection 绑定为显示following 的List的数据源,List标签中建itemrenderer 代码如

<fx:Script>
		<![CDATA[

			[Bindable]
			public var displayname:String;
			override public function set data(value:Object):void{

				displayname = new String(value.flwname)

			}
		]]>
	</fx:Script>
	<s:VGroup>
			<s:Label text="{displayname}"/>
	</s:VGroup>

提示:也可显示头像、创建时间、时区等等

c.显示user ‘s friends Tweet   public Tweet

loadFriendsTimeline方法返回Tweet的Array包含text 和发布者信息等

var tmp:Array = event.data as Array;

for(var i:int;i<event.data.length;i++){ tweetArray.addItem(tmp[i])}

tweetArray:ArrayCollection绑定为显示tweet的DataGrid的数据源,DataGrid代码

<mx:DataGrid x="10" y="87" width="607" height="327" dataProvider="{tweetArray}">
			<mx:columns>
				<mx:DataGridColumn headerText="Tweet" dataField="text"/>
				<mx:DataGridColumn headerText="Tweeter" dataField="user.name" width="100"/>
			</mx:columns>
		</mx:DataGrid>

d.  提交新Tweet。添加输入框和提交按钮,按钮事件sendTweet()

public function sendTweet():void{

var Tweet:String = tweet.text

将输入内容赋值给变量Tweet

twitter.setStatus(Tweet);

提交Tweet

twitter.addEventListener(TwitterEvent.ON_SET_STATUS, onsetstatus)

监听是否成功

tweet.text = “”} 将输入框中文本清除

提交成功后onsetstatus方法刷新一下DataGrid的数据 定义刷新方法

function freshTweet()本例将loadFriendsTimeline方法提出另定义为LoadFriendsTimeLine方法,function freshTweet()执行LoadFriendsTimeLine方法。

e.  添加刷新按钮  添加button 定义skinClass=“com.skin.freshButton”按钮图存同一路径 freshButton 代码

<s:states>
		<s:State name="disabled" />
		<s:State name="down" />
		<s:State name="over" />
		<s:State name="up" />
	</s:states>
	<s:BitmapImage source="@Embed('arrow_refresh.png')"/>

按钮 buttonmode=“true”click=“freshTweet()”

f.   添加Alert.Show 。之前监听Error的响应方法 编写代码

var alert:Alert = Alert.show(“something was wrong,click button for try again”)

登录页面 检验是否输入用户名密码

if(userId.text==”"||passwd.text==”"){ Alert.show(“please enter your username and password!”)}

2 Twitter官网工具

API Status    查看各API状态

http://dev.twitter.com/status

API Console     Web Console

http://dev.twitter.com/start

Bug:Flex自动帧频1000!

用Flex4才发现了这个问题,

当用spark添加一个mx组件时不会有问题,但当这个mx组件中还有其他组件

例如<mx:HBox><mx:Canvas/></mx:HBox>

stage.frameRate会瞬间达到1000!

之后会自动恢复到默认的帧频(如果不手动设定,会是24)

这时不用担心什么问题,

但如果frameRate达到1000的这段时间中,添加了一个EnterFrame事件,

并且在EnterFrame的响应函数中,调整某个组件的位置,

frameRate就不会恢复回24,而是一直持续1000,知道取消了EnterFrame为止

源文件:
src
源码如下:
Application.mxml:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
			   xmlns:s="library://ns.adobe.com/flex/spark"
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" frameRate="12"
			 backgroundColor="0xFF00FF">
	<fx:Script>
		<![CDATA[

			import components.MyComponent;

			import mx.containers.HBox;
			import mx.core.UIComponent;
			import mx.events.FlexEvent;

			protected function button2_clickHandler(event:MouseEvent):void
			{
				trace(this.stage.frameRate);
				this.txt.text = "Current FrameRate:"+this.stage.frameRate.toString();
			}

			protected var _box:UIComponent;
			protected function button3_clickHandler(event:MouseEvent):void
			{
				_box = new MyComponent();
				this.container2.removeAllElements();
				this.container2.addElement(_box);
				button2_clickHandler(null);
				button4_clickHandler(null);
			}

			protected function enterFrameHandler(event:Event):void
			{
				if(_box){
					container1.x+=0.2;
				}
			}
			protected function button4_clickHandler(event:MouseEvent):void
			{
//				this.moveEffect.play([this.container2]);
				this.addEventListener(Event.ENTER_FRAME,this.enterFrameHandler);
			}
			protected function button5_clickHandler(event:MouseEvent):void
			{
				this.removeEventListener(Event.ENTER_FRAME,this.enterFrameHandler);
			}

		]]>
	</fx:Script>

	<fx:Declarations>
		<s:Move id="moveEffect" duration="10000" xFrom="10" xTo="300" yFrom="10" yTo="300"/>
	</fx:Declarations>
	<mx:Canvas id="container1" y="60" width="100%" height="100%"/>
	<s:SkinnableContainer id="container2" x="20" y="80" width="900" height="600"/>

	<s:Group>
		<s:layout>
			<s:HorizontalLayout>
			</s:HorizontalLayout>
		</s:layout>
		<s:Button click="button2_clickHandler(event)" label="Trace frameRate"/>
		<s:Label text="" id="txt" width="100"/>
		<s:Button click="button3_clickHandler(event)" label="load MyComponent"/>
		<s:Button click="button4_clickHandler(event)" label="Start Move"/>
		<s:Button click="button5_clickHandler(event)" label="Stop Move"/>
	</s:Group>
</s:Application>

components/MyComponent.mxml:

<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:fx="http://ns.adobe.com/mxml/2009"
		 xmlns:s="library://ns.adobe.com/flex/spark"
		 xmlns:mx="library://ns.adobe.com/flex/mx"
		 >
	<mx:Canvas backgroundAlpha="1" width="30" height="30" backgroundColor="0x0000F0"/>
</mx:HBox>

Flash/Flex监听浏览器的关闭事件

如果想用Flash/Flex监听浏览器的关闭事件,

可以通过JavaScript的window.onbeforeunload事件进行监听
然后JS调用Flash中的函数。
在swf所在页面的JavaScript中添加如下代码
JS中代码:(这里设定swf文件名为TestFlash)
window.onbeforeunload = onbeforeunloadHandler; //添加响应函数
function onbeforeunloadHandler()
{
var swfRef = document.TestFlash|| window.TestFlash; //获取swf的引用
if ( swfRef )  {
warning = swfRef.windowCloseHandler(); // 调用Flash中的windowCloseHandler函数
return “Are you sure to close this page?”;
}
}
AS中代码:(在程序初始化的函数中添加,例如Flex的creationComplete事件中)
if(flash.external.ExternalInterface.available){ flash.external.ExternalInterface.addCallback(‘windowCloseHandler’,externalWindowCloseHandler);
//使用ExternalInterface向JS中添加调用函数
}

/*

* 告诉服务器,该flash已经被关闭

*/
protected function externalWindowCloseHandler():void{

//use HttpService in Flex
var http:HTTPService = new HTTPService();
http.url = ‘http://localhost/testphp/index.php?from=flexcloseByHTTPService’;
http.send();
//use URLLoader in AS3
var request:URLRequest = new URLRequest(‘http://localhost/testphp/index.php?                from=flexcloseByUrlLoader’);
var urlLoader:URLLoader = new URLLoader();
urlLoader.load(request);
}
Flex中可以在FlashBuilder的HTML模板上添加JS代码

修改html-template中的index.template.html文件

在其中添加JS代码:

window.onbeforeunload = onbeforeunloadHandler; //添加响应函数
function onbeforeunloadHandler()
{
var swfRef = document.${application}|| window.${application};   //获取swf的引用
if ( swfRef )  {
warning = swfRef.windowCloseHandler();    // 调用Flash中的windowCloseHandler函数
return “Are you sure to close this page?”;
}
}
在AS中直接注入JS代码

如果不想更改HTML文件,也可以在AS中直接书写JS代码,注入到HTML文档中

if(flash.external.ExternalInterface.available){
var jsStr:String;

jsStr =
‘eval(\’window.onbeforeunload = onbeforeunloadHandler;’ +
‘function onbeforeunloadHandler(){‘ +
‘var swfRef = document.’+FlexGlobals.topLevelApplication.className+’ || window.’+FlexGlobals.topLevelApplication.className+’;’ +
‘swfRef.windowCloseHandler();’ +
‘return “Are you sure to close this page?”;’ +
‘}\’)';
flash.external.ExternalInterface.call(jsStr);

flash.external.ExternalInterface.addCallback(‘windowCloseHandler’,externalWindowCloseHandler);

}
移除该监听

只要设置window.onbeforeunload=null即可

AS中可以这样写

flash.external.ExternalInterface.call(‘eval(\’window.onbeforeunload = null\’)');

flash.external.ExternalInterface.call(‘eval(\’location.reload();\’)');        //再执行刷新浏览器的命令

源文件 :TestFlex.zip

Flex Log入门+扩展

(一)入门


Flex集成一个Log框架,可以完成很多用trace()做debug时完成不了的功能

输出log时可以实现分等级(共5+1级),用过滤器指定输出的类,以及输出方式(默认为trace)

需要用到的类

该类位于mx.logging包中,


共需要三个类和一个接口


mx.logging.Log – 主类,有几个静态方法,添加/移除TraceTarget和获取ILogger
mx.logging.LogEventLevel – 定义了log等级的常量
mx.logging.targets.TraceTarget – logger器,定义log输出等级,过滤器和输出方式


mx.logging.ILogger – 由Log.getLogger(‘ClassName’)获取到的Logger发送器


使用步骤

  1. 新建TraceTarget

    var traceTarget:TraceTarget = new TraceTarget();
    traceTarget.filters = ['spark.components.*','myPackage.MyClass']; //创建过滤器,可以直接用class名,也可以使用*类过滤整个包
    traceTarget.filters = [*]; //这样写过滤器,就是输出全部类了
    traceTarget.includeDate = true;    //输出信息是否包含日期
    traceTarget.includeTime = true; //输出信息是否包含时间
    traceTarget.includeLevel = true; //输出信息是否包含等级
    traceTarget.includeCategory = true; //输出信息是否包含class名
    traceTarget.level = LogEventLevel.INFO; //设定输出的等级
    Log等级说明
    log共分为5级和ALL
    分别是ALL(0), DEBUG(2), INFO(4), WARN(6), ERROR(8), FATAL(1000)
    每个等级在输出时都包含了自身及后续等级的信息
    即当把等级设定为INFO时,INFO, WARN, ERROR, FATAL中的信息都会被输出,而排在INFO前面的DEBUG则不会被输出


  2. 将TraceTarget添加到Log中
    Log.addTarget(traceTarget);//可以addTarget多个TraceTarget,以便于用不同方式跟踪不同的信息
    //移除的方法:Log.removeTarget(traceTarget);
  3. 获取ILogger并输出
    var info:ILogger = Log.getLogger(‘myPackage.MyClass’); //获取ILogger,getLogger的参数用于过滤器使用
    info.info(‘trace log massege’); //输出指定等级的log信息
    info.debug(‘trace log massege,’trace log massege2′); //参数可以任意个,与trace()相同
    info.error(‘trace log massege‘);
    info.warn(‘trace log massege‘);
    info.fatal(‘trace log massege‘);
    info.log(LogEventLevel.INFO,’trace info’,'masseage’); //
    或者直接点
    Log.getLogger(‘spark.components.Button‘).warn(‘trace log massage’);

扩展

自定义一个简单/安全getLogger

Log.getLogger()方法需要输入完整的class名作为参数,这样很麻烦而且容易出错,每次对类或包做了重构,就要重新修改这个参数
可以扩展该功能,直接使用对象本身作为参数
例如:
public function myGetLogger(classObject:Object):ILogger{
var _className:String = flash.utils.getQualifiedClassName(classObject);
var _category:String = _className.replace(‘::’,’.’);

return Log.getLogger(_category);

}
自定义输出位置

TraceTarget中默认使用trace()进行输出,该功能可以自定义,例如输出到服务器端或者某个TextArea中去

方法是继承TraceTarget或LineFormattedTarget(TraceTarget的父类),然后override internalLog方法(注意该方法使用了mx_internal命名空间)

package myPackage

import mx.core.mx_internal;

import mx.logging.targets.TraceTarget;

import mx.rpc.http.HTTPService;
use namespace mx_internal;
public class MyTraceTarget extends TraceTarget
{
public function MyTraceTarget()
{
super();
}
override mx_internal function internalLog(message:String):void{
var httpService:HTTPService = new HTTPService();
httpService.url = ‘http://localhost/logAction’;
httpService.send({log:message});
}
}
}

Flex/FlashBuidler中批量添加Module

传统的在Flex工程中添加Module的方法是:在FlashBuilder中右键工程目录->Porperties->Flex Modules, 然后就可以add/edit/remove需要的module了,

但问题 是无论添加多少module都要点击add按钮一个一个添加! 像我们的项目一个demo就用了好几十个module,一个一个添加可要烦死了

网上搜‘批量添加module’没有结果,于是自己琢磨了一下

原来module的配置信息就藏在工程目录下的.actionScriptProperties中(PS:该文件在FB中是隐藏的,需要去文件目录中看)

.actionScriptProperties文件格式是xml的

module的配置信息就.actionScriptProperties文件中<modules></modules>标签中

例如我的是:

.actionScriptProperties

<modules>
<module application=”src/index.mxml” destPath=”com/ihaveu/Module1.swf” optimize=”true” sourcePath=”src/com/ihaveu/Module1.mxml”/>
<module application=”src/index.mxml” destPath=”com/ihaveu/Module2.swf” optimize=”true” sourcePath=”src/com/ihaveu/Module2.mxml”/>
</modules>
在每个module对应其中一条<module>标签
参数说明:
sourcePath  指向了module的mxml源文件
destPath  指向了module编译后的swf位置
optimize  是boolean值,决定是否对module进行优化
application  指向要优化的主程序,仅在optimize=‘true’时有用
需要批量添加、删除module时只需要在这个文件中添加、删除对应的<module>,然后刷新一次工程即可