在Flex中继承ProgrammaticSkin类自定义皮肤

通过自定义类的方式创建皮肤,控制性更强,占用的内存更少。
ProgrammaticSkin类是外观元素的基类,它们通过编程方式来绘制自身。
关于ProgrammaticSkin类的更多信息,猛击这里:
http://www.airia.cn/ActionScript3API/livedocs/mx/skins/ProgrammaticSkin.html

自定义类

package skins
{
    import flash.display.GradientType;
    import flash.display.Graphics;

    import mx.skins.ProgrammaticSkin;

    public class CustomBG extends ProgrammaticSkin
    {

        public function CustomBG()
        {
            super();
        }

        override protected function updateDisplayList(w:Number, h:Number):void
        {
            super.updateDisplayList(w, h);

            var g:Graphics = graphics;
            var fillColors:Array = [0x191919,0x262626,0x191919];
            var fillAlphas:Array = [1.0,1.0,1.0];
            var fillRatios:Array = [0,127,255]

            g.clear();

            drawRoundRect(0, 0, w, h, 0, fillColors, fillAlphas,
                          horizontalGradientMatrix(0, 0, w, h), GradientType.LINEAR,fillRatios );
        }

        override public function get measuredWidth():Number
        {
            return 8;
        }

        override public function get measuredHeight():Number
        {
            return 8;
        }
    }

}

在CSS中使用ClassReference调用自定义类

.customBg
{
backgroundSize: “100%”;
backgroundImage: ClassReference(“skins.CustomBG”);
}

Flex 中可能导致内存泄露的地方

收集了不少的会导致内存泄露的情况:

事件监听:

对父级对象加了监听函数,会造成内存泄露,例:

override protected function mouseDownHandler(…):void
 {
    systemManager.addEventListener(“mouseUp”, mouseUpHandler);

......

解决:
在销毁对象的时候,remove掉这些监听,虽然弱引用也可以避免这些问题,但自己掌控感觉更好。

但以下几种情况不会造成内存泄露:

  • 弱引用:someObject.addEventListener(MouseClick.CLICK, handlerFunction, false, 0, true);
  • 对自己的引用:this.addEventListener(MouseClick.CLICK, handlerFunction);
  • 子对象的引用:
    private var childObject:UIComponent = new UIComponent;
    addChild(childObject);
    childObject.addEventListener(MouseEvent.CLICK, clickHandler);
    

总之…有addEventListener,就removeEventListener一下吧,要为自己做的事负责~哈哈

清除引用

remove掉子对象后并不会删除该对象,他还保留在内存中,应该将引用设置为null

removeChildren(obj);
obj = null;

阅读全文 »

AIR日志记录方法

public static function log(txt:String):void
{
    var date:Date = new Date();
    var fileName:String;

    fileName = "errlog-" + date.getFullYear().toString() + (date.getMonth()+1).toString() + date.getDate() + ".txt";

    var file:File = File.applicationStorageDirectory.resolvePath(fileName);
    var fs:FileStream = new FileStream();

    txt = "\n\n--------" + date.toString() + "----------\n" + txt

    fs.open(file,FileMode.APPEND);
    fs.writeUTFBytes(txt);
    fs.close();
}

废话不多说,直接看代码,将需要记录的日志,比如出错信息记录到程序数据文件夹,以日期命名,便于追踪信息。

使用SWFObject插入Flash在IE下导致stageWidth为0的解决方法

SWFObject

SWFObject是一个用于在HTML中方面插入Adobe Flash媒体资源(*.swf文件)的独立、敏捷的JavaScript模块。该模块中的JavaScript脚本能够自动检测PC、Mac机器上各种主流浏览器对Flash插件的支持情况。它使得插入Flash媒体资源尽量简捷、安全。而且它是非常符合搜索引擎优化的原则的。此外,它能够避免您的 HTML、XHTML中出现object、embed等非标准标签,从而符合更加标准。

SWFObject在IE下的BUG

如果Flash里绘制的对象的宽高是自适应Flash的宽高的,那么,使用SWFObject来插入Flash在IE会导致一个问题,当这个Flash被缓存后,也就是第二次访问该页面时,在该Swf文件被加载时,获取到的stage.stageWidth和stage.stageHeight为0,绘制的对象也就看不到了。

阅读全文 »

读书笔记:ActionScript3设计模式中的单件模式

单件模式用于限制类的实例化次数,使你在系统的任何位置都能访问到同一个实例;达到节省资源,管理方便的效果。

单件模式的应用

从一个XML文件加载程序的基本配置信息,只需要在Flash初始化的时候或者Air程序启动的时候执行一次即可,并且,在程序的整个运行阶段都只需要一个实例,并不需要建多个实例或者读取多次XML。
例如:用一个xml文件保存AIR应用程序配置信息,里面包含窗口起始位置,窗口的宽高。

<setting>
	<window x="100" y="100" width="300" height="400">
</setting>

单件模式的实现

package cn.foxling.test
{
	public class Setting
	{
		private static var _instance:Setting;

		public function Setting(enforcer:SingletionEnforcer)
		{
		}

		public static function getInstance():Setting
		{
			if (Setting._instance == null) Setting._instance = new Setting(new SingletionEnforcer());
			return Setting._instance;
		}

	}
}

class SingletionEnforcer {}

阅读全文 »