我的最新日志

  • 自己写的关于图片拖放与缩放

    2008-6-30

    自己写的关于图片拖放与缩放和大家一起分享,也许里面还有BUG和写得不好的地方,希望大家多指教.

    main.swf
    (2008-06-30 12:51:10, Size: 7.38 kB, Downloads: 0)


    图片缩放旋转.rar
    (2008-06-30 12:51:10, Size: 20 kB, Downloads: 0)

  • (转)配色方案浅析

    2008-6-19

    文章来自:http://kingkovisions.zhan.cn.yahoo.com/apps/ncpcontent/?module_id=17400000018014&action=read&articleid=36
    一、红色的色感温暖,性格刚烈而外向,是一种对人刺激性很强的色。红色容易引起人的注意,也容易使人兴奋、激动、紧张、冲动、还是一种容易造成人视觉疲劳的色。
    1、在红色中加入少量的黄,会使其热力强盛,趋于躁动、不安。
    2、在红色中加入少量的蓝,会使其热性减弱,趋于文雅、柔和。
    3、在红色中加入少量的黑,会使其性格变的沉稳,趋于厚重、朴实。
    4、在红中加入少量的白,会使其性格变的温柔,趋于含蓄、羞涩、娇嫩。

    二、黄色的性格冷漠、高傲、敏感、具有扩张和不安宁的视觉印象。黄色是各种色彩中,最为娇气的一种色。只要在纯黄色中混入少量的其它色,其色相感和色性格均会发生较大程度的变化。
    1、在黄色中加入少量的蓝,会使其转化为一种鲜嫩的绿色。其高傲的性格也随之消失,趋于一种平和、潮润的感觉。
    2、在黄色中加入少量的红,则具有明显的橙色感觉,其性格也会从冷漠、高傲转化为一种有分寸感的热情、温暖。
    3、在黄色中加入少量的黑,其色感和色性变化最大,成为一种具有明显橄榄绿的复色印象。其色性也变的成熟、随和。
    4、在黄色中加入少量的白,其色感变的柔和,其性格中的冷漠、高傲被淡化,趋于含蓄,易于接近。

    三、蓝色的色感冷嘲热讽,性格朴实而内向,是一种有助于人头脑冷嘲热讽静的色。蓝色的朴实、内向性格,常为那些性格活跃、具有较强扩张力的色彩,提供一个深远、广埔、平静的空间,成为衬托活跃色彩的友善而谦虚的朋友。蓝色还是一种在淡化后仍然似能保持较强个性的色。如果在蓝色中分别加入少量的红、黄、黑、橙、白等色,均不会对蓝色的性格构成较明显的影响力。
    1、如果在橙色中黄的成份较多,其性格趋于甜美、亮丽、芳香。
    2、在橙色中混入小量的白,可使橙色的知觉趋于焦躁、无力。

    四、绿色是具有黄色和蓝色两种成份的色。在绿色中,将黄色的扩张感和蓝色的收缩感相中庸,将黄色的温暖感与蓝色的寒冷感相抵消。这样使得绿色的性格最为平和、安稳。是一种柔顺、恬静、潢足、优美的色。
    1、在绿色中黄的成份较多时,其性格就趋于活泼、友善,具有幼稚性。
    2、在绿色中加入少量的黑,其性格就趋于庄重、老练、成熟。
    3、在绿色中加入少量的白,其性格就趋于洁净、清爽、鲜嫩。

    五、紫色的明度在有彩色的色料中是最低的。紫色的低明度给人一种沉闷、神秘的感觉。
    1、在紫色中红的成份较多时,其知觉具有压抑感、威胁感。
    2、在紫色中加入少量的黑,其感觉就趋于沉闷、伤感、恐怖。
    3、在紫色中加入白,可使紫色沉闷的性格消失,变得优雅、娇气,并充满女性的魅力。

    六、白色的色感光明,性格朴实、纯洁、快乐。白色具有圣洁的不容侵犯性。如果在白色中加入其它任何色,都会影响其纯洁性,使其性格变的含蓄。
    1、在白色中混入少量的红,就成为淡淡的粉色,鲜嫩而充满诱惑。
    2、在白色中混入少量的黄,则成为一种乳黄色,给人一种香腻的印象。
    3、在白色中混入少量的蓝,给人感觉清冷、洁净。
    4、在白色中混入少量的橙,有一种干燥的气氛。
    5、在白色中混入少量的绿,给人一种稚嫩、柔和的感觉。
    6、在白色中混入少量的紫,可诱导人联想到淡淡的芳香。
  • 一岁了

    2008-6-18

        今天是20080618,去年的这个时候也就是20070618.我进入了现在的这家公司以一个AS程序员的身份.哈哈,其实那时候可以说是懂点很肤浅的AS,接触的也比较少.在这一年,自己经历从AS2到AS3的过程,从中也学习到了很多的东西.只是不晓得,这样的时间和学习到的东西是否成正比.在这里很感谢我的师傅,我的父母,以及关心我的同事们.在这年中,我一直以"一颗恒心成为行业大师"自勉.不过越是学习,就发现自己的不足.上周末,回家看到中央台的节目<我们>俞敏洪老师的一场演讲感触很深,很喜欢里面的一句话"有目标,有恒心,悄悄干".我想这将成为我下一年的鞭策.哈哈...
  • (转)在Flash中动态生成js代码并执行

    2008-6-16

    本文来自:http://www.sujun.org/article.asp?id=29

    flash执行部分js代码,而且必须动态生成的.研究一下,发现js有个类似as以前的函数
    "eval",呵呵,在这里做文章就可以了
    eval能把字符串转化为对应的对象或是数值,而且还可以执行表达式.
    例子代码很简单,在此仅做个记录

    ExternalInterface.call("eval", "alert('生成成功,soda');");

  • 关于Flash Player垃圾回收的文章(转)

    2008-6-06

    本文来自:http://blog.5d.cn/user6/xbzg/200801/461444.html

    原文

    Understanding garbage collection in Flash Player 9

    翻译

    目前我暂时在研究Actionscrīpt 3.0,它的能力让我很激动。它的原生执行速度带来诸多可能(此句原文The raw execution speed by itself provides so many possibilities. raw本意未加工,原始的,这里的意思是指引入AVM2之后,Actionscrīpt 3.0在执行速度上有了很大提高,所以使支持更复杂的组件成为可能,译者注)。它引入了E4X、sockets、byte 数组对象、新的显示列表模型、正则表达式、正式化的事件和错误模型以及其它特性,它是一个令人炫目的大杂烩。

    巨大的能力意味着巨大的责任,这对Actionscrīpt 3.0来说一点没错。引入这些新控件带来一个副作用:垃圾收集器不再支持自动为你收集垃圾等假设。也就是说Flash开发者转到Actionscrīpt 3.0之后需要对关于垃圾收集如何工作以及如何编程使其工作更加有效具备较深入的理解。没有这方面的知识,即使创建一个看起来很简单的游戏或应用程序也会出现SWF文件内存泄露、耗光所有系统资源(CPU/内存)导致系统挂起甚至机器重启。

    要理解如何优化你的Actionscrīpt 3.0代码,你首先要理解垃圾收集器如何在Flash Player 9中工作。Flash有两种方法来查找非活动对象并移除它们。本文解释这两种技术并描述它们如何影响你的代码。

    本文结尾你会找到一个运行在Flash Player9中的垃圾收集器模拟程序,它生动演示了这里解释过的概念。

    关于垃圾收集器

    垃圾收集器是一个后台进程它负责回收程序中不再使用的对象占用的内存。非活动对象就是不再有任何其他活动对象引用它。为便于理解这个概念,有一点非常重要,就是要意识到除了非原生类型(Boolean, String, Number, uint, int除外),你总是通过一个句柄访问对象,而非对象本身。当你删除一个变量其实就是删除一个引用,而非对象本身。

    以下代码很容易说明这一点:

    Actionscrīpt 代码
     
    1. // create a new object, and put a reference to it in a:  
    2. var a:Object = {foo:"bar"}  
    3. // copy the reference to the object into b:  
    4. var b:Object = a;  
    5. // delete the reference to the object in a:  
    6. delete(a);  
    7. // check to see that the object is still referenced by b:  
    8. trace(b.foo); // traces "bar", so the object still exists.  

    如果我改变上述示例代码将b也删除,它会使我创建的对象不再有活动引用并等待对垃圾收集器回收。Actionscrīpt 3.0 垃圾回收器使用两种方法定位无引用的对象 : 引用计数法和标识清除法。

    引用计数法

    引用计数法是一种用于跟踪活动对象的较为简单的方法,它从 Actionscrīpt 1.0开始使用。当你创建一个指向某个对象的引用,该对象的引用计数器加1;当你删除该对象的一个引用,该计数器减1。当某对象的计数器变成0,该对象将被标记以便垃圾回收器回收。

    这是一个例子:

    Actionscrīpt 代码
     
    1. var a:Object = {foo:"bar"}  
    2. // the object now has a reference count of 1 (a)  
    3. var b:Object = a;  
    4. // now it has a reference count of 2 (a & b)  
    5. delete(a);  
    6. // back to 1 (b)  
    7. delete(b);  
    8. // the reference count down is now 0  
    9. // the object can now be deallocated by the garbage collector  

    引 用计数法简单,它不会非CPU带来巨大的负担;多数情况下它工作正常。不幸地是,采用引用计数法的垃圾回收器在遇到循环引用时效率不高。循环引用是指对象交叉引用(直接、或通过其他对象间接实现)的情况。即使应用程序不再引用该对象,它的引用计数器仍然大于0,因此垃圾收集器永远无法收集它们。下面的代码 演示循环引用是怎么回事:

    Actionscrīpt 代码
     
    1. var a:Object = {}  
    2. // create a second object, and reference the first object:  
    3. var b:Object = {foo:a};  
    4. // make the first object reference the second as well:  
    5. a.foo = b;  
    6. // delete both active application references:  
    7. delete(a);  
    8. delete(b);  

    上 述代码中,所有应用程序中活动的引用都被删除。我没有任何办法在程序中再访问这两个对象了,但这两个对象的引用计数器都是1,因为它们相互引用。循环引用 还可以更加负责 (a 引用 c, c引用b, b引用a, 等等) 并且难于用代码处理。Flash Player 6 和 7的XML对象有很多循环引用问题: 每个 XML 节点被它的孩子和父亲引用,因此它们从不被回收。幸运的是Flash Player 8 增加了一个叫做标识-清除的新垃圾回收技术。

    标识-清除法

    Actionscrīpt 3.0 (以及 Flash Player 8) 垃圾回收器采用第2种策略标识-清除法查找非活动对象。Flash Player从你的应用程序根对象开始(Actionscrīpt 3.0中简称为root)直到程序中的每一个引用,都为引用的对象做标记。

    接下来,Flash Player遍历所有标记过的对象。它将按照该特性递归整个对象树。并将从一个活动对象开始能到达的一切都标记。该过程结束后,Flash Player可以安全的假设:所有内存中没有被标记的对象不再有任何活动引用,因此可以被安全的删除。图1 演示了它如何工作:绿色引用(箭头)曾被 Flash Player 标记过程中经过,绿色对象被标记过,白色对象将被回收。

    fig01

    Figure 1. Flash Player采用标记清除方法标记不再有活动引用的对象

    标记-清除法非常准确。但是,由于 Flash Player 遍历你的整个对象结构,该过程对CPU占用太多。Flash Player 9 通过调整迭代标识-清除缩减对CPU的占用。该过程跨越几个阶段不再是一次完成,变成偶尔运行。

    延期(执行)垃圾回收器和不确定性

    Flash Player 9垃圾回收器操作是延期的。这是一个要理解的非常重要的概念:当你的对象的所有引用删除后,它不会被立即删除。而是,它们将在未来一个不确定的时刻被 删除(从开发者的角度来看)。垃圾收集器采用一系列启发式技巧诸如查看RAM分配和内存栈空间大小以及其他方法来决定何时运行。作为开发者,你必须接受这样的事实:不可能知道非活动对象何时被回收。你还必须知道非活动对象将继续存在直到垃圾收集器回收它们。所以你的代码会继续运行(enterFrame 事件会继续)、声音会继续播放、装载还会发生、其它事件还会触发等等。

    记住,在Flash Player中你无权控制何时运行垃圾收集器去回收对象。作为开发者,你需要尽可能把你的游戏或应用程序中无用的对象应用清除。管理无用对象的策略将会在我的另一篇文章重点介绍:Flash Player 9的资源管理策略。

    下图模拟垃圾回收器中总内存(包含活动对象和非活动对象的和,译者注)的锯齿状部分(点击图2或下方链接)。锯齿的产生是由于垃圾回收器执行回收(原文执行 清除,疑为执行回收)。点击该图并注意,按下空格键来中止或重启,并在运行时按住up/down键头以控制内存使用趋势。

    http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html#

    Figure 2. Garbage collection simulation

    Garbage collection simulation

    正如下面演示的一样(单击图3或下方链接),拖动对象(圆角矩形)到桌面并建立它们之间的引用(使用连线,译者注)。点击run reference或mark and sweep按钮以查看哪些对象会被回收。对象上有标识到该对象的引用个数。

    http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html#

    Figure 3. Garbage collection simulation: mark and sweep

    Garbage collection simulation: mark and sweep

    从这里通往何方?

    理解垃圾回收机制是编写优化代码的重要前提。优化的代码保证你的Flash项目在客户机器上运行时不会带来大的冲击。阅读更多相关文章,Flash Player 9中的资源管理策略,或访问Flash开发者中心以及Flash Player开发者中心。

    也可以查看我的blog gskinner.com 阅读关于弱引用的文章并下载我写的一个辅助类。

    关于作者

    Grant Skinner是gskinner.com公司CEO及架构师,该公司是一个Flash开发和咨询公司。他与新媒体机构以及有进取心的客户合作开发前沿应用、游戏和多媒体程序。他擅于将支持接口设计的代码、可用性、市场和业务逻辑融汇,由此带给他国际上赞誉并获得包括Best Canadian Developer at FITC 2005在内的多个业界大奖。Grant在gskinner.com/blog/写blog并在incomplet.org展示他的验证性的创作。

     

     

     

    第二篇

    转自:http://www.kingda.org/archives/kingda/2007/10/as_hack.html

    ----------------------------------------------------------------------------------------
    首先,要感谢校友学长“费gg”的帮助,提供了核心的hack技术的方法。
    然后鉴于几天前一网友关于画上万个sprite之后内存增大问题,在此一并作一下讨论和解决。
    -----------------------------------------------------------------------------------------
    概述:AVM2理论上是自带垃圾回收机的,但是具体何时进行垃圾回收,理论上非人为所能控制,而我们若要强制启用垃圾回收机,则需要用一些非正规手段,比如如下会提到的手段。

    关键字:垃圾回收

    核心hack技术
    批注:所谓强制执行垃圾回收机,是指通过故意使swf在运行时出错,然后throw出错误,而同时通过catch error来继续运行swf文件。而垃圾回收机则会在swf抛出错误的时候,被强制执行一次,以清除内存中无效的数据占用,减少资源的消耗。
    我当初也是这么理解的,不过从“费gg”处所学到的,包括自己所测试的,并不是所有的error throw都能触发垃圾回收机,而也只局限于某些特定的error,而上文的例子中的这一error恰为其中的一种error类型。

     

    try{
            new LocalConnection().connect("MoonSpirit");
            new LocalConnection().connect("MoonSpirit");
    }catch(error : Error){

    }

    运行上述代码,可强制执行一次垃圾回收机。

    具体测试:

    分别用initNoBitmapDataView()和initBitmapDataView()进行10k个举行元素创建


    测试结果:
    1.1不使用BitmapData 内存占用 40M

    2.1使用BitmapData 依旧内存占用 40M!
    原因分析: 虽然_sqrList被设为null,但是原先被_sqrList所引用的1w个sprite数据依旧在内存中存在,虽然AMV2自带垃圾回收机,但是何时进行垃圾回收是不确定的。而要强制执行垃圾回收机,则要用上文提到的hack手段
    2.2使用BitmapData + 垃圾回收hack 内存占用 12M

     

    package {
            import flash.display.Bitmap;
            import flash.display.BitmapData;
            import flash.display.Sprite;
            import flash.net.LocalConnection;

            public class MoonSpirit extends Sprite {
                    private const SQR_AMOUNT                        : int = 10000;    //方块数量      
                    private var _container_sp                : Sprite;          //容器sprite
                    private var _sqrList                                : Array;           //所有方块的引用
                  
                    public function MoonSpirit() {
                            init( );                      
                    }
                  
                    private function init( ) : void{
                            _container_sp = new Sprite( );
                            addChild(_container_sp);
                            //initNoBitmapDataView( );
                            initBitmapDataView( );
                    }
                  
                    //初始化 通过通常手段 显示
                    private function initNoBitmapDataView( ) : void {
                            layoutTenThousandSqr( );
                    }
                  
                    //初始化 通过BitmapData快照 显示
                    private function initBitmapDataView( ) : void {
                            layoutTenThousandSqr( );
                            var myBitmapDataObject : BitmapData = new BitmapData(150, 150, false, 0xFF0000);
                            var myImage:Bitmap = new Bitmap(myBitmapDataObject);
                            addChild(myImage);
                            unLayoutTenThousandSqr( );
                            _sqrList = null;
                            doClearance( );
                    }
                  
                    private function layoutTenThousandSqr( ) : void {
                            _sqrList = new Array( );
                            for(var i : int = 0; i < SQR_AMOUNT; i++){
                                    _sqrList.push(new Sprite());
                                    _sqrList[i].graphics.beginFill(0xff0000);
                                    _sqrList[i].graphics.drawRect(0,0,100,100);
                                    _sqrList[i].graphics.endFill();
                                    _container_sp.addChild(_sqrList[i]);
                            }
                    }
                  
                    //不显示
                    private function unLayoutTenThousandSqr( ) : void {
                            for(var i : int = 0; i < SQR_AMOUNT; i++){
                                    _container_sp.removeChild(_sqrList[i]);
                                    delete _sqrList[i];
                            }
                    }
                  
                    //精髓,垃圾回收机强制调用
                    private function doClearance( ) : void {
                            trace("clear");
                            try{
                                    new LocalConnection().connect("foo");
                                    new LocalConnection().connect("foo");
                            }catch(error : Error){
                                  
                            }                      
                    }
            }
    }

  • 交互(转)

    2008-6-06

    本文来自http://cn.aswing.org/?p=14#comment-277

    URLLoader :用于从网络或者本地读取文件,可以通过设置他的 dataFormat 属性改变收到的文本类型。默认值为 URLLoaderDataFormat.TEXT 纯文本格式。

    URLLoader 部分事件。

    complete :使用 URLLoader.load() 方法后,数据完全加载完毕时触发,说明程序加载完成。

    ioError 使用 URLLoader.load() 方法时, 发生致命I/O错误时触发。

    open 使用 URLLoader.load() 方法后,开始从服务器下载数据时触发。

    progress :使用 URLLoader.load() 方法后,在从服务器下载数据的过程中持续触发, 通过侦听此事件我们可以很方便的做信息加载状态的显示。

    securityError FlashPlayer 的安全异常, 比如跨域加载错误。

     

    URLRequest 用于传递变量到服务器,以及 URLLoader load 的目标路径。 可以通过设置他的 contentType 属性改变发送到服务器的变量类型。

    URLVariables :键/值对, user=zhuam&password=111

    URLLoaderDataFormat :用于设置读取文件的类型,有 TEXT (纯文本), VARIABLES (/值对)BINARY (二进制格式)URLLoader 会根据类型不同来进行解码操作。

    URLRequestMethod 设置用哪种方式来传递数据, POST 或者 GET

    URLReqeustHeader URL HTTP 头部。

     

    一、HTTPAS3 Remoting

     

    由于 Flash 对跨域访问有严格的权限限制,故而获取其他站点的页面信息,我都是在服务端做了一层 Proxy。

    package c2s 

    { 

        import flash.events.Event; 

        import flash.events.IOErrorEvent; 

        import flash.events.SecurityErrorEvent; 

        import flash.net.URLLoader; 

        import flash.net.URLLoaderDataFormat; 

        import flash.net.URLRequest; 

        import flash.net.URLRequestMethod; 

        import flash.net.URLVariables; 

        import flash.utils.ByteArray; 

         

        public class HttpServiceInvoker 

        {       

           protected var resultCallbackFunction : Function;             

            protected var errorCallbackFunction : Function;   

            

           // 请求地址 

           private const urlAddress : String = “http://gcc.cuscstar.com:8080/weatherHttpProxy.jsp”; 

            

           public function HttpServiceInvoker(resultCallback : Function, errorCallback : Function) 

           { 

               resultCallbackFunction = resultCallback; 

               errorCallbackFunction = errorCallback; 

               super(); 

           } 

            

           public function getWeather2(city: String): void { 

               // 建立 URLRequest 对象 设置 GET 方法调用 

               var request : URLRequest = new URLRequest(urlAddress); 

               request.method = URLRequestMethod.GET; 

                

               var cityVar : URLVariables = new URLVariables(); 

               cityVar.city = city;         

               request.data = cityVar; 

                

               // URLLoader DATA FORMAT 设置 BINARY 格式用于做Response字符集的转换 

               var loader : URLLoader = new URLLoader(); 

               loader.dataFormat = URLLoaderDataFormat.BINARY; 

                

               loader.addEventListener(Event.COMPLETE, resultCallback); 

               loader.addEventListener(IOErrorEvent.IO_ERROR, errorCallback); 

               loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, errorCallback); 

               loader.load(request); 

           } 

            

           private function resultCallback(event:Event):void {      

               /// 将接收的数据转换为 ByteArry ,通过 readMultiByte 来转换编码格式 

               var ba:ByteArray = ByteArray(URLLoader(event.target).data); 

            var rhtml:String = ba.readMultiByte(ba.length, “gb2312″); 

             

            resultCallbackFunction(rhtml); 

        } 

         

        private function errorCallback(event:Event):void { 

             

        } 

     

        } 

    }

     

     

    二、Hessian 

     

    Hessian ( http://hessian.caucho.com/ria/ )Caucho公司制定的一个 RPC 协议,虽然它也是通过 HTTP协议传输 RPC 封包,但是它的 RPC 封包却是以二进制形式编码的,而且能够表现对象模型和异常体系,这使得 Hessian XML-RPC 更有效率。 

     

    1、  首选需要我们去 http://hessian.caucho.com/#Flash/Flex 下载Hessian的最新Flash 版本 hessian-flash-3_1-snap.swc30k)。

     

    2、  引用该 swc 到您的 AsWing 项目中,下面这段代码是通过AS3来调用 Java后台的一个Hessian气象信息服务,注:Java 部分的 Hessian 服务的开发与实现在此就不做叙述,有心之人皆可 Google ,讲解的文章很多。 

     

    3、  AS3 通过 Hessian Java 交互 Code  ( 获取城市天气信息 ) 

     

    package c2s 

    { 

     

        import flash.events.IOErrorEvent; 

         

        import hessian.client.HessianAsyncToken; 

        import hessian.client.HessianProxy; 

        import hessian.events.HessianErrorEvent; 

        import hessian.events.HessianResultEvent;  

         

        public class HessianServiceInvoker {  

            

           protected var resultCallbackFunction : Function;             

            protected var errorCallbackFunction : Function;   

            

           private var proxy:HessianProxy = new HessianProxy(“http://gcc.cuscstar.com:8080/hessian/service.do”); 

            

           public function HessianServiceInvoker(resultCallback:Function, errorCallback:Function) {     

                resultCallbackFunction = resultCallback;      

                errorCallbackFunction = errorCallback;     

                super();     

            }     

            

            public function resultCallback(data:Object):void {         

                resultCallbackFunction(data);     

            }     

             

            public function errorCallback(data:Object):void {         

            }  

     

           public function getWeather2(city: String):void 

           { 

             var token:HessianAsyncToken = proxy.getWeather2(city); 

             token.addEventListener(HessianErrorEvent.HESSIAN_ERROR, errorCallback); 

             token.addEventListener(HessianResultEvent.HESSIAN_RESULT, resultCallback); 

           } 

        } 

    }

      

    三、AMF3 ( Action Message Format )

     

    Adobe就提出AMF(Action Message Format)技术,即将Java等语言的对象转换为Actionscrīpt对象的技术规范。AMF是将数据对象高度压缩,编码后作为2进制来传输的,比起WebServiceHTTPServiceXML在效率上的确是有很大的提升。 

     

    Adobe AMF协议及Java版本的AMF实现Blazeds也已经开放, 

    http://labs.adobe.com/technologies/blazeds/ 

    服务端Java AMF服务的实现,在此不做叙述,下面这两个部分的代码一个是用纯AS3完成服务的调用,另一个采用Flex3 Framework 来完成服务的调用。 

     

    AS3 利用 Adobe AMF3 协议与 Java 交互 Pure AS3

     

    package c2s 

    { 

        import flash.net.NetConnection; 

        import flash.net.ObjectEncoding; 

        import flash.net.Responder; 

         

        public class Amf3ServiceInvoker  

        {              

                   

           private var nc : NetConnection = new NetConnection();    

           private var responder : Responder = null; 

     &nbs

  • loading自身 urlLoader.complete

    2008-5-29

       这两天在做loading自身,感觉没有想2里面那么方便了.其中也遇到些问题.在用root.loaderInfo.addEventListener的时候,是分成2帧进行的,无法在第一帧之前帧听第一帧的内容.也就是说如果使用了很多组件和类并且都在第一帧导出的话,侧会使第一帧内容加大致使其大小不能忽略.所以问题1:如果使用这种方法如何尽可能减小第一帧数据.如果用的是做一个loader的swf导入main.swf,我自己在这里是采用的这种办法.其一loading比较准确,其二等于加了一层外壳起到一定保护作用.问题就是在加载main.swf的时候stage生成比较慢,这里解决的办法是在帧进去以后才获得的.可以使用add_to_stage事件

        在使用urlLoader的complete接受写回数据的乱码问题.

  • urlLoader与外部通讯的例子

    2008-5-28

    flash部分:

    var outText:TextField=new TextField()
    outText.type="dynamic"
    outText.width=200
    outText.border=true
    addChild(outText)
    var urlLoader:URLLoader=new URLLoader()
    var mydata:URLVariables=new URLVariables()
    mydata.sendData="收到了吗?"
    var urlr:URLRequest=new URLRequest()
    urlr.data=mydata//提交的数据
    urlr.method=URLRequestMethod.POST
    urlr.url=stage.loaderInfo.parameters.postSrc//通过flashvars从外部获取一个提交地址
    outText.appendText("提交地址:"+urlr.url+"\n")
    urlLoader.load(urlr)
    urlLoader.addEventListener(Event.OPEN,loaderOpenHandler)
    urlLoader.addEventListener(Event.COMPLETE,loaderCompleteHandler)
    function loaderOpenHandler(e:Event)
    {
     outText.appendText("======loaderOpenHandler========\n"+mydata.sendData+"\n")
    }
    function loaderCompleteHandler(e:Event)

        outText.appendText("======loaderCompleteHandler========\n"+e.target.data)//接受的数据  
    }

    提交asp:

    <%@LANGUAGE="VBscrīpt" CODEPAGE="65001"%>
    <%
    dim val
    val=Request("sendData")
    if not isNull(val) then
    Response.Write("收到了")//直接写,FLASH接受的数据
    end if
    %>

     

  • 检测FlashPlayer版本的代码

    2008-5-22

    var versionString:String = Capabilities.version;
    var pattern:RegExp = /^(\w*) (\d*),(\d*),(\d*),(\d*)$/;
    var result:Object = pattern.exec(versionString);
    if (result != null)
    {
        trace("input: " + result.input);
        trace("platform: " + result[1]);
        trace("majorVersion: " + result[2]);
        trace("minorVersion: " + result[3]);    
        trace("buildNumber: " + result[4]);
        trace("internalBuildNumber: " + result[5]);
    }
    else
    {
        trace("Unable to match RegExp.");
    }
    通过js版本检测:
    

    AC_FL_RunContent的DetectFlashVer和GetSwfVer两个函数可以对swf进行版本检测和对比

    if(DetectFlashVer(9,0,0))
    {
       AC_FL_RunContent(...)
    }
    else
    {
    var flashVerPrompt="请先确认是否安装了 Flash 播放器</br>"
                      +"点击下面链接获取最新的 Flash Player 播放器</br>"
                      +"<a href=http://fpdownload.macromedia.com/get/flashplayer/current/licensing/win/install_flash_player_active_x.exe>下载Flash Player 播放器</a>"
        document.write(flashVerPrompt)
    }

  • JavaScript 与 ActionScript 3.0 交互的一些问题(转)

    2008-5-21

    本文来自  http://www.coolcode.cn/show-291-1.html 

        这两天做基于 Flash9(Actionscrīpt 3.0)的 Javascrīpt PHPRPC 3.0 客户端时遇到了一些 Javascrīpt 与 Actionscrīpt 3.0 交互的一些问题,这些问题在网上基本上都没有找到答案,最后通过不断的尝试才得以解决,因此在这里总结出来,希望能给遇到同样问题的同志们一些帮助。

    Javascrīpt 跟 Actionscrīpt 3.0 交互也是通过 flash.external.ExternalInterface 这个类,不过与跟 Flash 8 中跟 Actionscrīpt 2.0 交互所使用的 flash.external.ExternalInterface 还是有所不同的。最大的不同就是 ExternalInterface.addCallback 方法在 Actionscrīpt 3.0 中只有 2 个参数了,而不再有 instance 这个参数。下面要讨论的这些问题都是关于 Flash 9 中 Actionscrīpt 3.0 的。

    先来说最常遇到的问题,就是在 Javascrīpt 调用 Flash 中的 Actionscrīpt 方法时报告该方法不存在。这个问题是跟 Flash 中执行 ExternalInterface.addCallback 的时间有关的,ExternalInterface.addCallback 必须要在 HTML 的完全载入之后也就是 window.onload 事件执行后才可以执行,否则,它所发布的方法都无法在 Javascrīpt 中调用。

    解决这个问题的方法在 Flash 9 的 Actionscrīpt 3.0 帮助中有个例子,里面包含了这个解决方法,就是首先在 js 中设置两个标志,例如 jsReady 和 swfReady 这两个变量作为标志,开始都设置为 false,当 window.onload 时,设置 jsReady 为 true,在 Flash 中一开始检查 Javascrīpt 中的这个 jsReady 标志是否是 true(通过 ExternalInterface.call 方法调用 Javascrīpt 中的返回这个标志的一个函数),如果不为 true,就设置一个定时器,经过一段时间后(例如 50 或 100 毫秒)重复这个检查这个标志,一旦为 true,则执行 ExternalInterface.addCallback 来发布 Actionscrīpt 要提供给 Javascrīpt 调用的函数或方法,执行完所有的 ExternalInterface.addCallback 后,通过 ExternalInterface.call 方法调用 Javascrīpt 中的设置 swfReady 标志的函数设置 swfReady 为 true。之后,当 Javascrīpt 检测到 swfReady 为 true 后,再调用 Actionscrīpt 中的方法就不会遇到上的说的这个问题了。

    如果简单一点的调用这样还可以,如果是有好多这样的调用就比较麻烦了。我是通过建立两个执行队列:jsTaskQueue 和 swfTaskQueue,当在 jsReady 为 true 之前,如果有要调用 Actionscrīpt 的操作,就把这个操作放到 jsTaskQueue 中,当 js 在 window.onload 中执行设置 jsReady 时,把这个队列中的任务取出来执行,当 jsReady 为 true 后 swfReady 为 true 之前,如果有要调用 Actionscrīpt 的操作,就把这个操作放到 swfTaskQueue 中,当 Actionscrīpt 通过 ExternalInterface.call 方法调用 Javascrīpt 中的设置 swfReady 标志的函数设置 swfReady 为 true 时,把这个队列中的任务取出来执行。当 jsReady 和 swfReady 都为 true 时,那么如果有要调用 Actionscrīpt 的操作,直接运行就可以了。通过这种方法把这些任务封装后,使用这些封装之后的操作,在编写代码就可以按照顺序(而不是异步)来写了,执行时也是顺序执行啦。

    除了这个最常遇到的问题之外,还有两个关于 IE 上的问题。

    如果你是通过 Javascrīpt 动态创建的 Flash 标签然后插入到 html 中的话(例如通过 innerHTML 赋值的方法或者 appendChild 的方法),很可能你这个操作是在 window.onload 之后才进行,在这种情况下,其它浏览器可以正常进行 Javascrīpt 和 Actionscrīpt 3.0 的交互,IE 就不行。所以,为了保险,最好的方法就是直接把 flash 标签的 html 写在 html 的 body 中,或者用 Javascrīpt 的 document.write 来写入 html 的 body 中,后面这种方法对于 IE 来说更合适一些,因为这样的话,可以不需要点击激活 Flash。

    另一个问题是,不要在 Actionscrīpt 中发布名字为 invoke 的方法,否则在 IE 中,Javascrīpt 调用该方法时会出错。

    最后一个问题,网上可以查到的比较多了,就是不要把 flash 放到 form 中,否则在 IE 中,Javascrīpt 调用 Actionscrīpt 时会出错。当然,网上也给出了一个解决这个问题的脚本,不过那个貌似是针对 Flash 8 的 Actionscrīpt 2.0 的,我没有试过,不知道对 Actionscrīpt 3.0 是否同样有效。


    11 月 23 日补充:

    今天又发现一个问题,如果在 Actionscrīpt 中通过 ExternalInterface.call 调用 Javascrīpt 时,如果传递的参数有字符串,那么字符串中如果包含 \ 符号的话,那么将会调用失败。这个也是 Actionscrīpt 和 Javascrīpt 交互的一个 bug,解决办法是,对传递的字符串先进行一下处理在传递,处理方法很简单,比如要传递的数据是 data,将它进行一次 data.replace(/\\/, “\\\\”) 替换之后,在传递给 Javascrīpt 就可以了。

我的最新涂鸦

Open Toolbar