About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Jul

    28

    Flash 中有时为了提高性能,采用延迟刷新,一个 callLater 全局函数与 一个 CallLater 类的下载: 延迟刷新.rar

    我比较喜欢这个类:

    package
    {
        import flash.display.Shape;
        import flash.events.Event;
        import flash.utils.Dictionary;

        public class CallLater extends Shape
        {
            protected static var _instance:CallLater;
            protected var callLaterHash:Dictionary;

            public function CallLater()
            {
                callLaterHash = new Dictionary();            
            }

            //p_frameDelay需要被延迟的帧数
            public static function call(p_function:Function, p_frameDelay:uint = 1, p_params:Array = null):void 
            {
                getInstance().call(p_function, p_frameDelay, p_params);
            }


            public function call(p_function:Function, p_frameDelay:uint, p_params:Array):void
            {
                callLaterHash[p_function] = new CallLaterData(p_frameDelay, p_params);

                if (hasEventListener(Event.ENTER_FRAME) == false) { 
                    this.addEventListener(Event.ENTER_FRAME, onFrame);
                }
            }

            protected function onFrame(p_event:Event):void 
            {
                var hasRun:Boolean = false;

                for (var func:Object in callLaterHash) 
                {
                    hasRun = true;
                    var obj:CallLaterData = callLaterHash[func] as CallLaterData;
                    if (--obj.delay == 0) 
                    {
                        if (obj.params != null) 
                        {
                            (func as Function).apply(null, obj.params);

                        } else {
                            func();
                        }
                        delete callLaterHash[func];
                    }
                }

                if (hasRun == false) 
                { 
                    removeEventListener(Event.ENTER_FRAME, onFrame)
                }
            }


            protected static function getInstance():CallLater {

                if (_instance == null) 
                {
                    _instance = new CallLater()
                }

                return _instance;
            }
        }
    }


    internal class CallLaterData  
    {
        public var delay:int;
        public var params:Array;

        public function CallLaterData(p_delay:uint, p_params:Array)
        {
            delay = p_delay;
            params = p_params;
        }
    }

    Jul

    2

    一般意义上来说,自定义创建 Spark 组件分两个部份。两个部份分别指两个具体的类,一个业务逻辑类,一个皮肤类(下文中所有术语如“外观状态”、“外观部件”等全部采用A DOBE 官方中文手册资料中的术语为准)。

    业务逻辑类:

    在该类中,除了具体的业务逻辑外,需要实现以下几步:

    1、定义对应的皮肤。

    2、通过 [SkinState] 元标签定义组件支持的外观状态的。

    3、通过 [SkinPart] 元标签标识皮肤的部件(外观部件)。

    皮肤类:

    1、使用 [HostComponent] 元标签指定对应的组件。

    2、声明与业务逻辑类中对应的每个外观状态,并定义每个外观状态的实际外观。

    一般为 MXML 文件,可以含有从设计类软件中导出的 FXG 文件数据

    3、定义皮肤部份在舞台上的显示方式(即 id 属性对应业务逻辑类中的外观部件)

    More...