-
开发日志 - 解耦 - [技术]
2010-10-29 | flex 解耦 AdvanceDatagrid
这几天的工作,让我知道解耦在系统设计中的重要性。我们宁愿牺牲一下速度,也要保持设计符合一般的设计规则。
简单,解耦,在一般人的认识范畴之内,不要做比较诡异的设计和实现,有时候你觉得很好,但是在团队里面,却是一个个噩梦。
Flex 有个bug,你在继承AdvanceDatagrid的类中显式调用super(),flex会抛出一个莫名其妙的exception,你要么用calllater,要么不要显示调用super()。
但是calllater实在是要非常谨慎的使用,这个方法严重破坏了程序的可读性和可预测性。
另外,对event的控制真的需要使用Struts类似的控制模式,要在config里面集中注册和管理,这样才不至于成为你的噩梦。
更多:开发日志 - 解耦 - [技术] -
如果你点击Spark DropDownList,那么Spark DropDownList默认就会马上打开一个popup的窗口,但是我不想这样,我希望popup窗口在我控制之下打开。
为了实现这个目标,我基本上完全浏览了这个控件的源代码,Spark DropDownList全部控件都是写在Spark DropDownList Skin中的,由一个Popupanchor,一个按钮,一个label组成,在Spark DropDownController中,会给button添加事件,看下面代码
private function addOpenTriggers():void { // TODO (jszeto): Change this to be mouseDown. Figure out how to not // trigger systemManager_mouseDown. if (openButton) { if (isNaN(rollOverOpenDelay)) openButton.addEventListener(FlexEvent.BUTTON_DOWN, openButton_buttonDownHandler); else openButton.addEventListener(MouseEvent.ROLL_OVER, openButton_rollOverHandler); } }那我就给openButton加了一个事件
this.openButton.addEventListener(FlexEvent.BUTTON_DOWN,handler,false,1);
注意最后一个参数是指这个Listner的优先级,只有加了这个,那么这个handler才能比原来注册的Listner先执行。
为什么要先执行?因为我们要做下面的事情。
private function click(event:Event):void { event.preventDefault(); event.stopImmediatePropagation(); }这个被证明是最好的方法,我可是花了好长时间才弄出来,因为我要把Adobe的源代码翻个底朝天。走了好多弯路,花了好多时间,不过证明技术到最后不是最大的难题,什么技术问题都能解决的。
更多:开发日志 —Flex 改变 Spark DropDownList的默认行为 - [技术] -
开发日志 - 关于Flex Event的Scope管理 - [技术]
2010-10-19 | flex event scope
今天费了好多时间来调试一个bug,到最后只改了四个字母,非常之优雅地解决这个问题。
这是一个关于Event的Scope管理不好,Event的生命周期结束之前有一个意料之外的Listener。简化的例子如下
var objectA; var objectB; objectB.addChild(ObjectA); objectA.addListener(Event.CREATE, handler); objectB.addListener(Event.CREATE, handler); objectA.dispatchEvent(new Event(Event.CREATE));
事实上,原本设计程序的人只想这个Create Event在objectB自身内被捕捉相应,而不是给外部的类或者说是父节点来捕捉到。
修复这个bug 我就改了
objectB.addListener(Event.CREATE, handler,true);
让这个事件只在capture的阶段被响应.
我觉得事件的scope可以有空间上和时间上的划分,
空间上,可以控制event在哪个类里面被响应。
时间上,可以控制event在哪个环节上可以被响应。
这样也许更好。
同时,event的addlistner方式虽然用起来很方便,但是的确不容易管理和维护,你很难知道这个event丢出去之后到底谁来响应,所以有很多无用的event被创建和销毁,大大降低app的性能。
我还是比较喜欢struts中控制action mapping的方式,可以在一个地方注册好自己的event的创建和event的listner,这个是个比较独裁的方式,但是真的可以减少很多痛苦。
更多:开发日志 - 关于Flex Event的Scope管理 - [技术] -
开发日志 —Flex App - [技术]
2010-10-15 | flex 工作
这两天的TG开发不是很快,因为最近在重新思考整个工具的工作流程,想重新梳理下,得出一个完整而简洁的流程。
逐渐接触新公司的代码,发现大家写的code也不是那么nice,没办法,时间不允许,谁也不愿意冒险为了质量而超过deadline。混乱是每天需要面对的事情。
更多:开发日志 —Flex App - [技术] -
- Java处理图片,想到导出清晰的图片要注意两个环节,一个是设置Graphic2d的setRenderingHint,另外一个是设置JPEGEncodeParam的setQuality,后者是关键,参考,参考2
- Flex载入swf影片的时候,需要使用mx:Image来做为container,参考
更多:开发日志 Java图片处理 - [技术] -
开发日志 - Flex Spark Skin - [技术]
2010-09-28 | Flex Spark Skin
-
记得两三个月之前自己看到一个栅格画,觉得很有意思,我当时也觉得,自己也能做出来。
拖拉了好久,今天终于找到时间做了下,写程序很快,不过把原理想通,倒是挺费力的,人笨。
明天,会有更加有趣的版本,今天就写在这里记录下自己的成果。
鼠标放到栅格上,拖动栅格就能看到一个小球来回转动
更多:开发日志-奇妙的栅格画-第一出 - [技术] -
Flex Lifecycle的好文 - [技术]
2010-08-10 | Flex Lifecycle
-
Neuro Productions 创意图像互动工作室 - [牛a和牛c之间]
2010-06-10 | neuroproductions flex 图像
Neuro Productions 是个创意图像互动工作室,这个工作室充满了富有创意和高技术含量的图像实验性作品,太令人诧异了。
这是今天最可爱的发现
更多:Neuro Productions 创意图像互动工作室 - [牛a和牛c之间] -
Flex性能优化 - [技术]
2010-02-24 | Flex 性能 Performance
最近涉及到了大规模运算的使用,所以提高性能的需求比较迫切,我尝试了一下几个方法,性能能从20×20提高到50×50个点的矩阵。
- 用Enterframe来代替Timer驱动计算
- 千万不要使用Array的revert功能,尤其是在你的array里面有万个元素的时候,宁可多写一个循环从尾巴开始遍历
- Math的任何函数都是费时间的,如Sin,如果可以,先把360度的sin值求出来放入数组中,用sin[250]来求值
- Math.min(a,b)不如a>b?b:a
- 习惯使用位值操作 a>>2 == a/2
- 用乘法,不要用除法, a*0.5比a/2快
Flash不太适合图形的大规模运算,所以我要很扣才行。
有时候,只有到了这种资源稀缺的时候,你才有心思去好好规划自己的算法,好好去整理自己的代码,其实也是件很有趣的事情。
将来,我想引入Flex profiler 来找出ObjectLinks里面的瓶颈,因为将来会有更加耗费时间的碰撞检测,边界检测,和将来3D空间的ObjectLinks。
参考资料
Round up of ActionScript 3.0 and Flex optimization techniques and practices
Optimizing Flex Applications(幻灯片)
Optimizing Adobe AIR for Code Execution, Memory, and Rendering
更多:Flex性能优化 - [技术] -
ObjectLink Bug 修复 - [技术]
2009-12-29 | flex objectLink
看下面两个对比,第一个距离合适,第二个距离会变大
有bug的
假设未知问题为f,与这问题相关的变量是x=单位帧里位移调整次数,y=单位帧里位移计算次数,那么问题的方程就是f(x,y),然后x的变量是z=每次位移量,假设y的值足够大,那么f可以写成f(x(z))。
所以得出结论,如果要解决这个问题,就必须要根据小球的数目,调整位移次数。来解决这个bug
更多:ObjectLink Bug 修复 - [技术] -
新版小球 - [技术]
2009-12-29 | flex objectLink
-
gskinner provides us a very good resolution for proximity detection, but again, if you try to learn it, you have to go back to the original stage and understand his idea.
Finally, excellent idea apply to everything in the world, people, technology.
更多:Excellent Proximity Detection - [技术] -
前面两个小玩意的修复版 - [技术]
2009-11-25 | flex ObjectLink bug 修复
-
一日一玩意 - [技术]
2009-11-25 | flex ObjectLink
-
开源项目ObjectLink - [技术]
2009-11-24 | objectLink flex 粒子系统
ObjectLink是准备开源的一个项目,师从Box2d以及诸多来自Making Thing Move的例子。
师从Box2d是指表现形式类似,不过也仅此而已,成品将会是和Box2d异常不同的东西。
将来会是3个方向
1 物理引擎
2 粒子系统
3 插件扩展
不过最近都在忙出国的事情,一时间进度不是很快,呵呵,估计第一个版本还要到明年春节之后才能问世。
下面是一个小小的Concept Provement,不是很惊艳,但是足以说明他可以做很多东西,期待下吧
更多:开源项目ObjectLink - [技术] -
flex blog集中 - [技术]
2009-11-13 | away3d flex
-
AVM3-Alchemy应该是个很有前途的东西 - [技术]
2009-11-13 | flex alchemy
-
Flex 奇怪需求一览 - [技术]
2009-11-05 | flex 需求
- Datagrid中显示行号,行号不随其他Column的排序而变化
- Datagrid中以HH:MM:SS格式显示时间,时间支持排序
- 用代码在Datagrid初始化时,对Datagrid的指定字段排序
- 数组arr,设置一个key,arr["sort"] = "test",遭遇错误,如何提供替代方式
- 在flash player激活的时候给舞台上Object设置focus
有兴趣的话,帮忙回答下。
更多:Flex 奇怪需求一览 - [技术] -
Flex-用Timer制作一个码表(计数器) - [技术]
2009-11-03 | 计时器 flex timer
马上要用到这个Timer,本来想去找现成的,不过发现现成的计时器不多,于是自己做了一个。看效果
搞了半天,还是有bug,不过不是TimeComputer.as的错,那就算了吧,大家将就看着
看源文件
更多:Flex-用Timer制作一个码表(计数器) - [技术] -
做了一个panel来测试Flickr API的调用,这次没有用现成的类库,自己重新做了一个,这个panel可以很好地让你了解Flickr API的步骤,以下做个小说明
- 第一个需要你输入你的api_key和secret
- 选择生成新的frob,生成的frob会出现在新打开的网页url中
- 把url的frob取出,输入Frob框
- 下一步,程序会自动获取token
- 基于xml配置生成方法列表
- 同样根据xml的配置生成参数输入框。
- 所有的调用结果都在console中出现
点这里看这个小panel(chrome不支持直接打开?)源代码在这里
更多:Flex -Flickr API Test Panel - [技术] -
Flex - 3维物理引擎 Jiglibflash 3d physic engine - [技术]
2009-10-09 | jiglibflash flex physic engine
-
Away3D利器-Prefab3D 1.0 - [技术]
2009-09-17 | away3d flex prefab3d VizualPV3D
Prefab3D 1.0是为Away3D而开发的一个图形化编辑器,不过目前还在开发阶段,不是很完整,拭目以待。
另外也不能忽略了专门为PV3D VizualPV3D。
可惜现在没有时间去试用他们.....
更多:Away3D利器-Prefab3D 1.0 - [技术] -
Flex - 如何获取TextArea中的行数
2009-09-14 | flex textarea lines
private function updateStats(evt:Event):void { var nLines:uint = textArea.mx_internal::getTextField().numLines; var nChars:uint = textArea.length; var str:String = "{0} characters; {1} lines"; }更多:Flex - 如何获取TextArea中的行数 -
Away3D中LineSegment的使用 - [技术]
2009-09-07 | Flex Away3D
private function generatePath():void { var i:int = 0 ; var prePos:Vertex = new Vertex(0,0,0); //var mat:WireframeMaterial = new WireframeMaterial(0xff0000,{width:4}); for (i;i<100;i++){ var line:LineSegment = new LineSegment({edge:400,width:1000}); line.start = prePos; prePos.add(new Number3D(60*Math.random(),30*Math.random(),50*Math.random())); line.end = prePos; scene.addChild(line); } }这样看起来就是一个弯曲的路径,看例子。或者source code,3D引擎是用Away3D的官网
更多:Away3D中LineSegment的使用 - [技术] -
Flex-让Alpha透明度设置作用于Text,Label控件 - [技术]
2009-09-03 | Flex textfield alpha transparent 透明度设置
Text Field透明度的问题困扰我许久,今天终于在flashyiyi那里找到了答案。
解决方案是设置TextField.blendMode = BlendMode.LAYER.
看一下示例
可以看到BlendMode.NORMAL图片可以正常隐藏,而文字不能,但是BlendMode.LAYER下两者都正常。
更多:Flex-让Alpha透明度设置作用于Text,Label控件 - [技术] -
Flex - Array 和ArrayCollection的性能比较 - [技术]
2009-09-02 | Flex Array ArrayCollection Performance 性能
一直想,写程序的时候要用Array呢还是ArrayCollection,array方法少,用起来不方便,从开发方便的角度来看要比ac好,但是效率方面怎么样呢?于是做了一个小程序验证一下。
结论是:Array优于ArrayCollection,从测试结果平均看来,AC的效率是随着object的数目呈线性下降的,Orz,而Array则是体现了优异的效率,在object增加的情况下,基本上没有太大的变化。所以如果在你需要遍历所有元素的情况下(比如说物理引擎,3D引擎等),Array是不错的选择
ArrayCollection(以下简称AC)应该是包装了Array的Wrapper,支持事件机制,你在对ArrayCollection中的对象进行增加删除更新操作时ArrayCollection会产生事件,可以通过collectionchange事件监听,所以在图表开发中都用ArrayCollection做数据源,一旦有更新,就会反映在图标上
既然如此,那么AC的效率肯定要比原生的Array要差的咯。下面的图表验证了这点。
程序会自动往Array和AC里面添加一定数量的Object{test:"hello"},(从零开始,每次递增1或者(总数/10),一直到你的输入的数值)。默认是1000个Object。
图表横轴是添加的Object的数量,纵轴Y是时间。有兴趣的话,看看源代码
更多:Flex - Array 和ArrayCollection的性能比较 - [技术] -
上次sword建议把链接的文字改得明显一点,在此谢谢sword大人的建议。
最近在研究flex的physical simulation,于是做了这个游戏,想给sword大人,也自己娱乐下。
操作很简单,上下左右,目的就是为了追上去kiss sword大人哈哈
这里开始kisss
有兴趣可以看看这个源文件。
更多:追不上的sword大人 - [技术]

