Posts Tagged ‘flex’

Autodesk的dragonfly

星期三, 3月 18th, 2009

dragonfly在英文中是蜻蜓的意思, 大概是Autodesk的该开发小组希望用户可以如蜻蜓一样灵活地飞翔于房屋里外,获取直接的观感。

dragonfly的简介:

介绍:
使用Dragonfly,你可以根据自己房屋的结构通过拖拽墙壁、窗户等本元素创建出房屋的基本架构,也就是描绘出毛坯房的房间布局;然后通过选择地板,拖拽家居、灯饰等物品放置到自己喜欢的位置来创建出装饰后的房间效果。这些效果不光是平面的,Dragonfly还能够展现三维的效果,支持旋转、缩放等三维操作。操作非常简单易用,而且功能比较丰富。三维场景中可以移动门窗,房间涂色等操作。

如果你觉得从毛坯房开始无从下手,你还可以选择已经装饰好了的跟你的房间结构相似的“样板房”来进行修改。Dragonfly提供了非常丰富的家俱,大到沙发、衣柜,小到厨房微波炉、浴室龙头,都应有尽有。相信你一定能找到你喜欢的。Dragonfly支持打印、保存、undo/redo等功能,是一个完整的系统。Dragonfly使用Flex作为实现技术,有比较酷的界面
效果。

dragonfly的体验网址是:

http://labs.autodesk.com/technologies/dragonfly/
http://dragonfly.autodesk.com

我用了一下,可能是选择的样板房比较复杂,操作起来感觉相当的不畅。可能毛坯房会好一点吧。。。由于自己不是室内装修设计师,也没有用过专业的室内设计软件,就无法对此进行评价了。

Flex 3D用来做的这个东西还是有点累,差一点的机器跑起来就不那么舒服了。

不过考虑到Autodesk是3D建模方面的建树,这个dragonfly也太小儿科了,用的工具是Adobe的Flex,有点丢前辈的架了。

Flex中AdvancedDataGrid的AdvancedDataGridColumn两种格式定义方法

星期六, 3月 7th, 2009

在用flex做一个股票版的演示,避免自己写太多的代码,就使用AdvancedDataGrid好了。

有些数据需要显示红色,有些数据需要显示绿色,当然了,这是股价。而有些数据不齐全,需要计算出来,比如有现价和昨收,而没有涨跌幅,这个需要使用现价和昨收计算出来。

1.根据数据显示红绿的方法:
在AdvancedDataGrid中指定一个styleFunction=”colStyle”
然后在actionscript段中实现这个colStyle:

private function colStyle(data:Object, col:AdvancedDataGridColumn):Object
{
var diff:Number = Number(data[col.dataField]) - Number(data["last"]);
//计算该列的数据与昨收的价差
if (diff < 0)
{
return {color:”green”}; //比昨收低,返回绿色
}
else
{
return {color:”red”};   //比昨收高,返回红色
}
}

当然,这仅是个简单的示例,还有不少细节需要完善的。

2.对于dataProvider里面没有的数据,比如涨跌额和涨跌幅,则使用AdvancedDataGridRendererProvider进行渲染

在AdvancedDataGrid的AdvancedDataGridColumn指定两列:

<mx:AdvancedDataGridColumn headerText=”涨跌” width=”64″ id=”change” />
<mx:AdvancedDataGridColumn headerText=”%”  width=”54″ id=”ratio” />

id分别是change和ratio.

然后在AdvancdeDataGrid中指令两个RenderProvider:

<mx:rendererProviders>
<mx:AdvancedDataGridRendererProvider column=”{ratio}” columnSpan=”1″

renderer=”RatioRender” />
<mx:AdvancedDataGridRendererProvider column=”{change}” columnSpan=”1″

renderer=”ChangeRenderer”/>
</mx:rendererProviders>

分别实现RatioRender和ChangeRenderer

ChangeRenderer.mxml:

<?xml version=”1.0″?>
<mx:Label xmlns:mx=”http://www.adobe.com/2006/mxml” textAlign=”center”>
<mx:Script>
<![CDATA[

override public function set data(value:Object):void
{
var diff:Number;
if (Math.abs(Number(value["now"])) < 0.001) diff = 0;
else diff = Number(value["now"]) - Number(value["last"]); //计算价差
if (Math.abs(diff) < 0.001)  //如果差距小于1/10分,就用黑色
{
setStyle(”color”, “black”);
}
else if (diff < 0)
{
setStyle(”color”, “green”);
}
else
{
setStyle(”color”, “red”);
}
text = diff.toFixed(2);          //设置显示内容,并限制小数点位数
setStyle(”textAlign”, “right”);  //右对齐
}

]]>
</mx:Script>

</mx:Label>

RatioRender.mxml也类似。

其余红绿的显示实际上也可以用2的方法来显示,只不过,针对不同的列,由于不能把列的信息传进这个Renderer里面,因此需要每个列单独写一个Renderer类,所以在内容可以使用dataProvider的列中,建议还是使用1的方法。

Flex中的组件事件顺序

星期三, 12月 24th, 2008

为了便于理解Flex里面组件的事件是如何发生的,我写了这么一些代码:

mxml:
<mx:Something ......
        addedToStage="trace('addedToStage')"
        creationComplete="trace('creationComplete')"
        enterFrame="if (!enterframeflag) {trace('enterFrame'); enterframeflag=true;}"
        initialize="trace('initialize')"
        preinitialize="trace('preinitialize')"
        resize="trace('resize')"
        show="trace('show')"
/>

然后再debug模式下运行,输出结果如下:

preinitialize
initialize
enterFrame
resize
[SWF] C:\Documents and Settings\polo\Desktop\study\testmenu\bin-debug\testmenu.swf - 877,825 bytes after decompression
creationComplete
addedToStage

再运行一次:

preinitialize
initialize
[SWF] C:\Documents and Settings\polo\Desktop\study\testmenu\bin-debug\testmenu.swf - 877,825 bytes after decompression
enterFrame
resize
creationComplete
addedToStage

[SWF]一行是解压过程,可以忽略不计。

剩下的内容就是组件事件的发生顺序了。

预初始化->初始化->进入桢->改变大小->创建结束->添加到场景。

而show事件没有发生。

flex中用树来显示搜索结果

星期三, 12月 24th, 2008

具体的要求是,我有一个大的树用来显示股票的名称和代码,然而股票实在是太多了,我又需要增加一个输入框,用户输入股票代码的时候,检索出匹配的项目,显示在树的上方。

mxml:

<mx:TextInput x=”5″ y=”10″ width=”160″ height=”25″ fontSize=”12″ id=”searchbox”
text=”输入:股票代码/股票名称”
click=”if (searchbox.text.length > 10) searchbox.text=”;”
focusOut=”if (searchbox.text.length == 0) searchbox.text=’输入:股票代码/股票名称’”
change=”searchstock();”    />

<mx:Tree x=”5″ y=”40″ width=”274″ height=”100%” id=”tree_1″
dataProvider=”{categoryData}” labelFunction=”treeLabel” iconFunction=”treeIcon1″
itemClick=”tree1_itemClick(event)” fontSize=”12″></mx:Tree>

ActionScript:

private function searchstock():void {
                var resultCount:Number = 10;
                var kw:String = searchbox.text;
                var dept:XMLList = category.sortmethod.(@code == "400");                
                //根据具体的xml格式获取树中显示搜索结果的节点。
                var i:Number;
                var j:Number;
                var c:Number;

                while (dept[0].item.length() > 0) {    //清空上次的搜索结果
                    delete dept[0].item[0];
                }
               
                if (kw.length < 2) return;

                for (i = 0, c = 0; i < alphaxml.klist.length(); i++) { //根据具体情况遍历股票列表
                    for (j = 0; j < alphaxml.klist[i].item.length(); j++) {
                        if (alphaxml.klist[i].item[j].@name.indexOf(kw) >= 0 && c < resultCount) {
                            dept[0].appendChild(alphaxml.klist[i].item[j]); //匹配的条目加入搜索结果
                            c++;
                        }
                        if (c >= resultCount) break;
                    }
                    if (c >= resultCount) break;
                }

                tree_1.expandChildrenOf(tree_1.firstVisibleItem, true); //展开搜索结果
            }

主要是:
1.清空树的某节点下的所有内容,因为在文档里面查不到,最后翻翻网上的例子,用一个简单的delete就行了。
2.展开一个节点,expandChildrenOf

Flex和Flash编译出来的体积

星期五, 11月 7th, 2008

去年开始接触的adobe的flex,然而一直都处于练手阶段,直到今年夏天才开始做一些小项目。结果一做,发现编译出来的swf体积比起以前用flash(不论哪个版本的)编译出来的大了好多。

比如这个页:http://im.v65.com.cn/data/showf.html
上面的swf是用flex开发的,有400多K,即使我把RSL的swc单独分出来,swf怎么也有200k左右。

于是决心不用那些flex组件,用flash cs开了个action script3的项目,把flex项目中的as代码移植过来,再换成自己画的组件,编译出来的swf,怎么也超不过60K……

在目前中国这种网络环境下,假如让黑龙江的用户去打开一个深圳的网页,网页大小超过200K还是很影响用户体验的。

Flash还是很适合做一些体积小的项目,开发周期短,运行速度快。

而Flex,我想用它来做AIR的程序应该比较合适,要是放在网页上,一方面影响下载速度,另一方面,运行时占内存也太多了。