as2 对象查看函数

08月 13th, 2008
  1. function traceObject(obj:Object, indent:Number):Void {
  2.     indent = indent ? indent : 0;
  3.     var indentString:String = "";
  4.     var i:Number;
  5.     var prop:String;
  6.     var val;
  7.     for (i=0; i<indent; i++) {
  8.         indentString += " ";
  9.     }
  10.     for (prop in obj) {
  11.         val = obj[prop];
  12.         if (typeof (val) == "object") {
  13.             trace(indentString+" "+prop+": [Object]");
  14.             traceObject(val, indent+2);
  15.         } else {
  16.             trace(indentString+" "+prop+": "+val);
  17.         }
  18.     }
  19. }

方便以后用。

发布成fp8++的swf中利用bitmapData平滑显示图片

08月 5th, 2008

其实在flash7和更早的版本只要用_quality = “HIGH”或”BEST”就可以控制图片平滑显示了,不过这样有个缺点,所有场景和元素都会平滑,严重消耗资源。
在flash8里adobe不让通过调整_quality来平滑图片了,可以利用bitmapData来替换。
在图片的MovieClipLoader加载完毕的时候:

  1. import flash.display.BitmapData;
  2. import flash.geom.Matrix;
  3. function __onLoadInit(target:MovieClip):Void {
  4.     var bd:BitmapData = new flash.display.BitmapData(target._width, target._height);
  5.     bd.draw(target);
  6.     target.attachBitmap(bd, 1, "auto", true);
  7. }

然后,这个target就被平滑的bitmapData替换掉了。
不过adobe似乎忘记了他对bitmapData的安全限制,fp9以下的客户端根本无法跨域draw到bitmapData,即使是fp9 plus,也要去loadPolicyFile,所以当图片分布在很多台服务器上的时候,根本没有什么好的办法解决这个问题,总不至于每打开一个app就遍历去加载几十个crossdomain.xml吧。
你干脆就不要让MovieClipLoader加载他出来,这样就没什么安全性问题了,这个世界也清净了,既然能加载出来,又不让draw,自相矛盾的啊,倒不如用回7算了。

fdt升级后非常郁闷

10月 23rd, 2007

每次build项目的时候都会出现假死,有时候就变成真死了。搞得每次切换项目后都提心吊胆的。
记得之前的版本不是这样的啊,是后台自动build,而且不会影响到前面的操作。准备用一段时间后再换回旧的试试感觉。
更郁闷的是,操作快一点经常会导致eclipse假死并被down掉(当然,我没有开自动build)。
总之就是不如之前的版本顺利,倒是反而用flex builder写Focuswing的过程中,一次都没有出现过问题。
所以我感觉,如果写as2的话,没什么必要升级fdt。如果写as3的话,用fb好了。

用AsWing开发了一个饭否桌面应用-Focuswing

09月 9th, 2007

下载swf文件:focuswing_1.0.rar
下载exe文件:focuswing_1.0.exe

采用as3,mvc模式开发。刚开始不习惯这种模式,用多了突然会觉得很顺手。
饭否:应该就不用介绍了吧
AsWing:aswing是一个开源的flash GUI框架,布局和架构思路类似javaswing。之前的A2版本由于只支持mtasc编译方式,所以在配置和使用上都略显复杂。不过目前的A3版本既可以支持Flex开发,也支持Flash编译方式开发,配置和使用几乎没有门槛。
更值得说一下的是,这个框架是由国人自己开发的,在国内这样的互联网环境下能有这样始终保持生命力的开源项目诞生和存在,还是满有意义的。
一直认为flex的组件以及mxml的编写方式局限性很大。虽然AsWing与flex的组件不具有可比性。不过AsWing显然提供了一种更为纯净的方式来使用as3。

关于as3事件的笔记

08月 17th, 2007

as2时代直接在dispatchEvent的时候跟上想跟的参数就可以了,as3增加了一个Event的继承类来承担其中的信息传递,不过看书看到关键时刻居然就没有了。于是笔记一下类实例怎么向外发送事件和传递参数,来点实用的。
发送事件的Guest,在Guest内发送”do_b”的Event:

  1. var e:GuestEvent = new GuestEvent(GuestEvent.DO_B);
  2. e.args = {author:"hirokimo",time:"21:10"};
  3. this.dispatchEvent(e);

这时候为了传递参数,使用一个继承Event的自定义事件类GuestEvent:

  1. package
  2. {
  3.     import flash.events.Event;   
  4.     public class GuestEvent extends Event
  5.     {
  6.         public static const DO_A:String = "do_a";
  7.         public static const DO_B:String = "do_b";
  8.         public static const DO_C:String = "do_c";      
  9.         public var args:*;   
  10.         public function GuestEvent(_type:String)
  11.         {
  12.             super(_type);
  13.         }
  14.     }
  15. }

最后,在类外面添加侦听和接收的地方:

  1. package
  2. {
  3.     public class EventTest
  4.     {
  5.         public function EventTest()
  6.         {
  7.             var guest:Guest = new Guest();
  8.             guest.addEventListener(GuestEvent.DO_B,handleB);
  9.         }
  10.         private function handleB(e:GuestEvent):void
  11.         {
  12.             trace("author:"+e.args.author
  13.             +" time:"+e.args.time);
  14.             //author:hirokimo time:21:10
  15.         }
  16.     }
  17. }

大功告成,之后就可以顺利的发送事件参数了。
不过有一点值得注意:Guest类里有时需要在初始化后直接dispatch一个Event出来,这时候因为外部addEventListener动作还没有完成,listener是收不到事件的。
这个问题很容易被忽略,如果一定要这么做,可以:
1.Guest初始化后timer几百毫秒再dispatch 或者
2.外面addEventListener完之后,主动调guest.xxx来发送。

as3 读书笔记

08月 5th, 2007

仅仅是笔记 没有讨论问题 大家请略过

1.用正则来replace字符串

  1. var str:String = "above thE cloud,around The shadow.";
  2. var pattern:RegExp = /the/ig;
  3. trace(str.replace(pattern, "my"));
  4. //above my cloud,around my shadow.

2.数组深度copy

  1. private function clone(source:Object):*
  2. { 
  3.     var myBA:ByteArray = new ByteArray();
  4.     myBA.writeObject(source);
  5.     myBA.position = 0;
  6.     return(myBA.readObject());
  7. }

3.遍历Object,这个和as3没什么关系,不过经常用到。

  1. private function traceObject(obj:Object, indent:uint = 0):void
  2. {
  3.     var indentString:String = "";
  4.     var i:uint;
  5.     var prop:String;
  6.     var val:*;
  7.     for (i = 0; i < indent; i++)
  8.     {
  9.         indentString += "\t";
  10.     }
  11.     for (prop in obj)
  12.     {
  13.         val = obj[prop];
  14.         if (typeof(val) == "object") 
  15.         {
  16.             trace(indentString + " " + prop + ": [Object]");
  17.             traceObject(val, indent + 1);
  18.         }
  19.         else
  20.         {
  21.             trace(indentString + " " + prop + ": " + val);
  22.         }
  23.     }
  24. }

开始用flex builder来as3

07月 29th, 2007

一直在找借口,要等到fdt3出来后才开始学as3,没想到fdt3的alpha就已经出来了-_-,下载了后总的来说,感觉已经失去了as2时代的优势了,抛开没有好的一个trace机制来说,flex builder的功能也完全可以取代之了。
不过还是会一直用它来写as2代码,卡卡。
关于fb3beta,试用感觉还不错,把快捷debug设置设成和flash里一样,然后在调试台里看信息。其实和写java的感觉差不多,怪不得java程序员那么容易上手as3-_-。
关于怎么设置的和flash里一样手感,可以参照eidiot同学的文章。
here:使用Flex Builder开发AS3程序
然后,总算可以开始了,虽然总比别人慢一拍。
至于flex组件和mxml编码方式,暂时不打算涉及,这种编码方式实在是满奇怪的。

饭否 FanFlash beta 1.3 发布

07月 1st, 2007

下载地址:fanflash-13-pro.exe(851k)

或者有需要swf文件直接用的朋友:fanflash-13-pro.rar(35k)
[由于flash安全问题在本地无法工作,需要传到网上.]

主要改进:
1.之前一直有朋友提议记住密码,可能我误会了大家的意思,现在不用每次输密码了-_-,当然重新开以后还是要输入一次得。
2.之前输入id的流程不太合理,感觉很麻烦,现在可以在客户端记住id,发信息使用当前id。当然,增加了更改id的选项,满足马甲狂人的需要。

3.重大改进,发信息时可以选择@好友。因为平时给好友@信息比较麻烦,尤其是昵称有中文和奇怪字符的好友。

4.修正了些bug…最后还是要谢谢大家留的建议.

flash做的饭否桌面工具 FanFlash beta 1.2

06月 17th, 2007

下载地址:fanflash-beta-1.2.exe

周末忙里偷闲做了这个东西出来,主要就是觉得饭否在同类站点里很有亲和力,可以明显看到团队的力量。而且比twitter稳定,希望他们越发展越好。主要功能:
1.发信息
2.看我的文章
3.看我和好友的文章(可刷新)
4.看好友列表
5.随便看看(可刷新)
其实就是api开发出来的几条功能,呵呵 -_-

mine:hirokimo
相当热爱互联网的同事:guke

1

2

解决 setInterval 和 clearInterval 脱僵状态的类

05月 26th, 2007

刚开始使用 setInterval 和 clearInterval 的时候,总是会被脱僵状态困扰。就是说,明明有时候将 intervalID给清理掉了,原来定义的间隔还是不停的执行着,具体的内容可以看aw同学的分析,讲的非常清晰了。于是为了避免出现未预期的程序问题,通常只好使用onEnterFrame来替代。
不过在单纯继承于Object,仅仅处理逻辑的类中,没有MovieClip来充当onEnterFrame的载体,为了创建interval还是要用到 setInterval 方法才行(除非你传一个MovieClip对象进来当holder)。于是参照分析中interval进出栈的做法,封装成一个Interval 类,使用起来就万无一失了。

  1. class Interval {
  2.     private var intervals : Array;
  3.     private var interval : Number;
  4.     public function Interval(obj : Object, func : String, time : Number) {
  5.         intervals = new Array();
  6.         interval = setInterval(obj, func, time);
  7.         intervals.push(interval);
  8.     }
  9.     public function clearIntervals() : Void {
  10.         for (var i in intervals) {
  11.             clearInterval(intervals[i]);
  12.             intervals.pop();
  13.         }
  14.         clearInterval(interval);
  15.     }
  16.     public function toString() : String{
  17.         return "[object interval]";
  18.     }
  19. }

调用:var x:Interval = new Interval(owner, “doSth”,500);
清除:x.clearIntervals();