2012年,刚刚毕业参加的工作的时候,在公司里面学习了Flex技术。由于本人是做Java的,Flex中的ActionScript语法和Java挺类似,所以学起来还比较顺手的。大概做了一年多和Flex相关的软件开发,然后就跳槽专攻Java了。现在Flex貌似已经不算使用非常广泛的框架了,但是存在即合理,我相信使用Flex技术的公司或者兴趣爱好者还是不少的。由于本人对Flex研究也是皮毛,利用Flex做出特别NB的软件也没有。现在这里分享一下自己独立做的一个Flex项目--甘特图。
甘特图就是一个缩小版的Project,里面的功能也不是很复杂。但是当初以我的水平,开发起来还是步步都是坑。当你以一个新手入场的时候,你才会知道挨的每一拳到底有多痛。当初开发甘特图的时候,基本上就我一个,网上找相关的资料,特别是和Flex有关的资料,那是相当的少。基本上没有看到我想要的。所以在利用Flex开发甘特图这方面的问题也全靠自己去琢磨,去解决。
现在回头看看甘特图的功能,整体而言并没有特别突出的亮点,但是开发的这段经历却一直让我记忆犹新。一个人奋斗了大半年,基本上每天加班。也享受问题得到解决后的喜悦,也是这段经历让我对以后的码农之路坚定了信心。
当初甘特图是作为一个插件为另一个项目服务的,但是另一个项目开发失败,导致甘特图也白开发了,当时是无比的心塞!!!!呕心沥血大半年,一下回到解放前!!!
将3年前的东西分享出来,的确有些扯淡了,算是一个小小的总结吧。
重点开始!
甘特图和服务交互采用WebService,我相信做开发的人对WebService都很熟悉,不用赘述。
甘特图中最困难的当属任务条的绘制和渲染,还有就是连接任务关系等相关的线条绘制。同时还有网络图的绘制也比较麻烦。
甘特图任务渲染使用高级表格AdvancedDataGrid,并重写了里面的一些方法。

<span style="white-space:pre">      </span>override protected function mouseDoubleClickHandler(event:MouseEvent):void{var dataGridEvent:AdvancedDataGridEvent;var r:IListItemRenderer;var dgColumn:AdvancedDataGridColumn;r=mouseEventToItemRenderer(event);if (r && r != itemEditorInstance){try{var dilr:IDropInListItemRenderer=IDropInListItemRenderer(r);if (columns[dilr.listData.columnIndex].editable){dgColumn=columns[dilr.listData.columnIndex];dataGridEvent=new AdvancedDataGridEvent(AdvancedDataGridEvent.ITEM_EDIT_BEGINNING, false, true);// ITEM_EDIT events are cancelabledataGridEvent.columnIndex=dilr.listData.columnIndex;dataGridEvent.dataField=dgColumn.dataField;dataGridEvent.rowIndex=dilr.listData.rowIndex + verticalScrollPosition;dataGridEvent.itemRenderer=r;dispatchEvent(dataGridEvent);}} catch(error:Error) {}}super.mouseDoubleClickHandler(event);}/***鼠标释放事件*/override protected function mouseUpHandler(event:MouseEvent):void{var r:IListItemRenderer;var dgColumn:AdvancedDataGridColumn;r=mouseEventToItemRenderer(event);if (r){if (r is AdvancedHeaderRenderColumnMc || r is AdvancedHeaderRenderColumn){return;}try{var dilr:IDropInListItemRenderer=IDropInListItemRenderer(r);if (columns[dilr.listData.columnIndex].editable){dgColumn=columns[dilr.listData.columnIndex];dgColumn.editable=false;}} catch(error:Error) {}}super.mouseUpHandler(event);if (dgColumn)dgColumn.editable=true;}
对于表格中可移动的组件需要使用自定义组件,大部分时间都花在了调试自定义组件上面。
<mx:LinkButton width="16"height="16"enabled="true"click="doClick()"y="{(GanttProperties.RowHeight - 16)/4 - 3}"id="openbutton"x="{offSize-20}"icon="@Embed('icon/gantt_open.png')"></mx:LinkButton><!--{GanttProperties.GanttEditor}--><s:HSlider id="ganttitem"enabled="{GanttProperties.GanttEditor}"skinClass="com.gantt.diycolumn.MyHSlider"minWidth="1"width="{ganttWidth}"height="{GanttProperties.GanttItemHeight}"y="{(GanttProperties.RowHeight - GanttProperties.GanttItemHeight)/4 -4}"x="{offSize}"minimum="0"value="{data.percent}"thumbRelease="release()"thumbDrag="releaseing()"thumbPress="releasePress()"maximum="100"dragEnter="doDragEnter(event)"dragDrop="doDragDrop(event)"/><mx:LinkButton x="{offSize+ganttWidth-14}"enabled="false"y="-2"id="lingxing"icon="{GanttProperties.stoneIcon}"></mx:LinkButton><diycolumn:GanttItem id="actualGanttItem"width="{actualDateWidth}"visible="{GanttProperties.ActualDate}"includeInLayout="{GanttProperties.ActualDate}"height="7"y="{(GanttProperties.RowHeight - 13)}"x="{actualDateOffSize}"></diycolumn:GanttItem><diycolumn:GanttItem id="estimatedGanttItem"width="{estimatedTimeLineWidth}"visible="{GanttProperties.EstimatedDate}"includeInLayout="{GanttProperties.EstimatedDate}"height="2"bdcolor="0x12345ab"y="{(GanttProperties.RowHeight - 8)}"x="{actualDateOffSize}"></diycolumn:GanttItem><mx:HBox id="assignment"width="{assignmentWidth}"height="{GanttProperties.RowHeight}"visible="{GanttProperties.TaskAssignment}"includeInLayout="{GanttProperties.TaskAssignment}"horizontalGap="20"y="0"x="{offSize+ganttWidth+14}"></mx:HBox>

网络图中,需要用各种形状来表示不同类型的任务。每种形状也全是用UIComponent画出来的。

/**画出一个矩形*/public function drawRectangle():void{sprite.graphics.beginFill(color);sprite.graphics.lineStyle(2, bdcolor, 1, true);sprite.graphics.drawRoundRect(0, 0, width, height, 10, 10);//sprite.graphics.drawCircle(width,height/2,radio);sprite.graphics.endFill();leftPoint.x=0;leftPoint.y=height/2;rightPoint.x = width;rightPoint.y = height/2;}/**画出一个菱形*/public function drawRhombus():void{sprite.graphics.beginFill(color);var vec:Vector.<Number>=new Vector.<Number>();vec.push(0, height / 2);vec.push(width / 6, 0);vec.push(width * 5 / 6, 0);vec.push(width, height / 2);vec.push(width * 5 / 6, height);vec.push(width / 6, height);var vec2:Vector.<int>=new Vector.<int>();vec2.push(0, 1, 5);vec2.push(2, 3, 4);sprite.graphics.drawTriangles(vec, vec2);sprite.graphics.drawRect(width / 6, 0, width * 2 / 3, height);//sprite.graphics.drawCircle(width,height/2,radio);sprite.graphics.endFill();drawLine(vec);leftPoint.x=0;leftPoint.y=height/2;rightPoint.x = width;rightPoint.y = height/2;}/**画三角形*/public function drawTrangle():void{sprite.graphics.beginFill(color);var vec:Vector.<Number>=new Vector.<Number>();vec.push(0, height / 2);vec.push(width / 2, 0);vec.push(width, height / 2);sprite.graphics.drawTriangles(vec);sprite.graphics.endFill();drawLine(vec);}
甘特图里面,本人最不满意的就是表格中的线条绘制。因为在用线连接跨表格的任务时,没有找到很好的方法让绘制出来的线条和表格合二为一。我使用的绘制方法是将线条用Shape画在表格之上。从而导致线条都是悬浮在表格之上,看着怪怪的。我也没有找到什么解决办法,希望大牛能够多出对策。
public function draw():void{graphics.clear();with (graphics){lineStyle(_thinkness, _color, _alpha, _pixelHinting, _scaleMode);moveTo(start.x, start.y);lineTo(end.x, end.y);}if (hasArrowHead){drawArrowHead();}}

甘特图里面还有一个最短路径算法,这个算法网上也很多,只是改成了ActionScript实现而已。

/**** 遍历从开始活动到结束活动的所有可能的路径:采用递归方式(如果后继任务集合为空,则表明到达结束,是一条成功路径,否则就继续遍历直到某个任务没有后继节点)* <功能详细描述>* @param allActivity* @param pos* @param arrOnePath* @param arrAllPath* @see [类、类#方法、类#成员]*/public  static function goAllPath(allActivity:Array,pos:int,arrOnePath:Array):void{arrOnePath.push(allActivity[pos]);var t:Object=allActivity[pos];var arrSucc:Array=t.successor;if(arrSucc.length==0){//成功到达终点,是一条路径var completePath:Array=new Array();for each(var tt:Object in arrOnePath){completePath.push(tt);}CommonUtil.arrAllPath.push(completePath)return;}else{//对后继的每个活动进行检查for(var  i:int=0;i<arrSucc.length;i++){var activity:Object=arrSucc[i];var  k:int=lookInActivityDatasForPos(allActivity,activity);goAllPath(allActivity,k,arrOnePath);var nowNumber:int=arrOnePath.length;//将最新加入到arrOnePath的活动弹出,选择其他活动重新开始搜索if(nowNumber>=1)arrOnePath.pop();} }}/**** 对所有查找到的路径进行选择找出最关键路径(即耗时间最长的路径,可能有多条)* <功能详细描述>* @param allActivity* @param allPath* @see [类、类#方法、类#成员]*/public static function markCriticalPath(allActivity:Array):void{var  pathSum:Number=0;var  maxpathSum:Number=0;var  k:int=0;for(var i:int=0;i<CommonUtil.arrAllPath.length;i++){var criticalPath:Array=CommonUtil.arrAllPath[i];for(var j:int=0;j<criticalPath.length;j++){var activity:Object=criticalPath[j];pathSum+=parseFloat(activity.cxsj);}if(maxpathSum<pathSum){k=i;maxpathSum=pathSum;CommonUtil.pathnum.splice(0,CommonUtil.pathnum.length);CommonUtil.pathnum.push(k);}else if(maxpathSum==pathSum){k=i;CommonUtil.pathnum.push(k);}pathSum=0;}}   

以上只是挑了一些重点说了一下,现在就是上图了,没有最终效果的展示,说得再多也是耍流氓。

最终效果就是这样,现在看看,还是比较丑的。
本人扣扣:826179140,有任何意见和想法的或者有需要源码的,可以联系本人。
源码地址

Flex框架-甘特图开发相关推荐

  1. jquery 甘特图开发指南

    JQuery.Gantt是一个开源的基于JQuery库的用于实现甘特图效果的可扩展功能的JS组件库. <link rel="stylesheet" href="cs ...

  2. 前端甘特图组件开发(一)

    背景 工作中需要在网页上实现甘特图,以展示进度数据.通过网上调研相关项目,找到一款 dhtmlx-gantt 组件,在低程度上满足项目需求,但在部分定制功能(如时间轴自定义.编辑弹窗样式风格等)并不能 ...

  3. 一文搞定dhtmlx-gantt调度界面,vue下使用dhtmlxgantt进行项目甘特图模块设计开发(前端界面显示篇(1))

    前言: 本文基于在较为成熟完整的项目,进行甘特图模块开发的内容.并不涉及node相关下载.安装及vue的相关使用. 1 需安装的模块 npm install dhtmlx-gantt npm inst ...

  4. 飞桨深度学习开源框架2.0抢先看:成熟完备的动态图开发模式

    百度飞桨于近期宣布,深度学习开源框架2.0抢先版本正式发布,进入2.0时代.其中一项重大升级,就是推出更加成熟完备的命令式编程模式,即通常说的动态图模式.同时在该版本中将默认的开发模式定为动态图模式, ...

  5. vue 改变domclass_基于 vue 开发甘特图组件的心路历程(兼设计分享)

    语雀原文 有更好的排版体验~ 这篇文章主要讲述笔者开发 v-gantt 甘特图组件的经过. 起源 公司项目有个甘特图的需求. 笔者考察了世面上 常见的甘特图组件 后,本着 我上我也行 的心态,以及考虑 ...

  6. 易度甘特图的功能介绍和开发手册

         易度甘特图发布1.5版本! 易度甘特图是当前WEB开发中领先的甘特图解决方案. 它是使用Javascript开发的,实现了与微软 Project 甘特图一致的界面和功能,可广泛应用于 项目管 ...

  7. 天纵智能软件快速开发平台甘特图插件

    定义 甘特图以图示的方式通过活动列表和时间刻度形象地表示出任何特定项目的活动顺序与持续时间.基本是一条线条图,横轴表示时间,纵轴表示活动(项目),线条表示在整个期间上计划和实际的活动完成情况.它直观地 ...

  8. Highcharts Gantt JS 现代 Web 开发的甘特图

    Highcharts Gantt JS 现代 Web 开发的甘特图 现代 不要使用过时的专有桌面解决方案.Java Applet 或 Flash 来为您的项目带来甘特图功能.Highcharts Ga ...

  9. 前端甘特图组件开发(二)

    自定义时间轴功能 由于常见的甘特图时间轴只支持按照天/周/月/年或者固定的时间单位进行划分,但实际使用场景下有时候会需要按照特定且不规则的时间段对进度数据进行直观划分.因此本组件在原时间轴的基础上添加 ...

最新文章

  1. GitHub:我开源我自己;CEO:不存在的
  2. rbpf粒子滤波slam matlab程序_学习笔记(优达学城)- 车辆定位之粒子滤波器(整合版)...
  3. mysql 主表某一列 小于某一个表的两列之和_关于MySQL索引知识与小妙招
  4. button属性,居然才发现
  5. 大型网站技术架构(二)--大型网站架构演化
  6. 16岁应该遵循什么_成人学习一般遵循的规律
  7. Windows8 游戏开发教程-二、关于资源和工具
  8. python字符串的10个常用方法总结
  9. Linux_基础_软件包管理
  10. 结构体中操作c语言,C语言中结构体的操作
  11. Quartz-第四篇 常规quartz的使用
  12. editormd显示后台html,editormd文档不显示内容了,js也全部都引入了
  13. oracle gbk 转码,oracle编码格式从utf-8转换为GBK
  14. 仙之侠道2玖章青门任务怎么做_仙之侠道Ⅱ攻略_仙之侠道Ⅱ柒章 任务全攻略 新手必看_牛游戏网魔兽地图专区...
  15. Lycoris Recoil再现!Unity实现Sakana~,代码思路解析,代码开源,Unity弹簧效果
  16. 苹果cmsV10程序无法搜索影片的处理教程
  17. [元带你学NVMe协议] NVME 2.0 新技术解决了什么痛点? 会带来哪些变革?
  18. 降噪耳机哪款比较好?佩戴舒适的降噪蓝牙耳机推荐
  19. 要习惯同时兼顾几个学习项目
  20. 蓝桥杯官网题1(含VIP试题且带详细解析!小白看过来!!

热门文章

  1. 用二—十进制编码器74LS147、译码器74LS249、七段数码管显示器组成一个1位数码显示电路,当0-9十个输入端中有一个接地时,显示相应数码;
  2. Oracle 常用命令总结
  3. keithley 2100 软件|keithley2400测试软件NS-SourceMeter
  4. H5项目中 ios的border不显示问题
  5. 按键清零是0xff吗c语言,msp40_c语言.docx
  6. 一个博士的深度调查:中国农村男青年“高价娶妻”研究
  7. 树莓派打造一个适合音乐制作的系统(声卡部分)
  8. 武汉大学计算机专业网络安全,武汉大学网络空间安全考研科目有哪些?
  9. python从入门到精通 邮电出版社_《人民邮电出版社Python深度学习入门:基于PYTHON的理论与实现》【价格 目录 书评 正版】_中国图书网...
  10. PW4203降压型1-3节锂电池充电芯片