可以画线,圆,方块,以及截取当前画板图像的功能。
直接上代码吧,我的环境是AIR 2.6, FB4。
ElectronicBoard.mxml 主程序。
<?xml version="1.0" encoding="utf-8"?> <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%" applicationComplete="init()" layout="absolute" showTitleBar="false" showStatusBar="false" showFlexChrome="false" borderStyle="none"> <mx:Script> <![CDATA[ import flash.net.dns.AAAARecord; import mx.binding.utils.BindingUtils; import mx.collections.ArrayCollection; import mx.controls.Alert; import mx.controls.FileSystemList; import mx.controls.FileSystemTree; import mx.core.Application; import mx.core.UIComponent; import mx.events.FlexEvent; import mx.graphics.ImageSnapshot; import mx.graphics.codec.JPEGEncoder; import mx.managers.PopUpManager; private var oY:Number; private var nX:Number; private var oX:Number; private var nY:Number; private var _isDown:Boolean=false; private var showBasePanelFlag:Boolean=false; private var _file:File; private var sprit:Sprite=new Sprite(); private var comUI:UIComponent=new UIComponent(); private var PrObj:Object=new Object(); private var _imgByteArray:ByteArray; private var saveDirectoryPath:String; [Bindable] private var pop1:ConsolePanel; private function init():void { //全屏 systemManager.stage.addEventListener(FullScreenEvent.FULL_SCREEN,fullScreenHand); systemManager.stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE; //清除画板 myPanel.removeAllChildren(); myPanel.visible=true; //0x869ca7设置画笔颜色。 myPanel.graphics.lineStyle(0,0xFFFFFF,0); //绘制一个透明度为0.1的画板。 myPanel.graphics.beginFill(0xFFFFFF,0.1); myPanel.graphics.drawRect(0,0,this.width,this.height); myPanel.graphics.endFill(); //添加鼠标事件监听,即画笔动作的处理。 myPanel.addEventListener(MouseEvent.MOUSE_DOWN,downHandler); myPanel.addEventListener(MouseEvent.MOUSE_MOVE,moveHandler); myPanel.addEventListener(MouseEvent.MOUSE_UP,upHandler); //弹出设置面板 pop1 = ConsolePanel(PopUpManager.createPopUp(myPanel,ConsolePanel,false)); //鼠标移动到设置面板上时,显示设置面板,否则隐藏到屏幕上方。 pop1.addEventListener(MouseEvent.ROLL_OVER,moveImage); pop1.addEventListener(MouseEvent.ROLL_OUT,moveout); //初始化设置面板位置。 pop1.x = (stage.width - pop1.width)/2; pop1.y = -220; //设置面板上的按钮事件处理。 pop1.btn_cancel.addEventListener(MouseEvent.CLICK,btn_cancel_clickHandler); pop1.btn_reset.addEventListener(MouseEvent.CLICK,btn_reset_clickHandler); pop1.btn_recovery.addEventListener(MouseEvent.CLICK,btn_recovery_clickHandler); pop1.prScrn.addEventListener(MouseEvent.CLICK,prScrn_clickHandler); //设置面板中保存清除,撤消,恢复等操作所涉及对象的集合。 if(pop1.indexList.length!=0) { pop1.indexList.removeAll(); } if(pop1.tempDel.length!=0) { pop1.tempDel.removeAll(); } } private function fullScreenHand(evt:FullScreenEvent):void{ if(evt.fullScreen) {} else {//一旦退出全屏即退出系统。 this.exit(); } } //---------截屏---------------- protected function prScrn_clickHandler(event:MouseEvent):void { var now:Date=new Date(); var encode:JPEGEncoder=new JPEGEncoder(100); var m : Matrix = new Matrix(); //ImageSnapshot类抓取myPanel面板的BitmapData var bmp:BitmapData = ImageSnapshot.captureBitmapData(myPanel,m,null,null,null,true); bmp.draw(myPanel,m); //解析为ByteArray _imgByteArray=encode.encode(bmp); //设置文件名 var imgName:String="\\"+df.format(now)+".jpg"; //第一次保存图片,打开保存位置对话框选择保存位置。 if (_file == null) { //默认打开的保存路径为桌面,并且对话框有默认的文件名,文件名为设置的imgName。 _file =new File(File.desktopDirectory.nativePath + imgName); //对话框标题。 _file.browseForSave("请选择截屏图片的保存位置"); //单击保存按钮派发事件。 _file.addEventListener(Event.SELECT,getSavePathHandler); //单击取消按钮将判断条件回置为初始状态。 _file.addEventListener(Event.CANCEL,function():void{_file = null;return;}); } else { //若是第一次以后打开,则_file不为空,saveDirectoryPath值已经在getSavePathHandler方法中赋值,其值为第一次选择的保存路径。 _file =new File(saveDirectoryPath + imgName); // Alert.show(_file.nativePath); writeDataToImage(); } } //点击保存按钮,触发select事件时的处理函数。 private function getSavePathHandler(event:Event):void { _file = event.target as File; //得到选择的路径,将其转换为数组处理。 var pathDirectoryArr:Array = _file.nativePath.toString().split("\\"); //去掉文件名。 pathDirectoryArr.pop(); // Alert.show(pathDirectoryArr.join("\\")); //将保存目录的路径保存到saveDirectoryPath变量中。 saveDirectoryPath= pathDirectoryArr.join("\\"); writeDataToImage(); } //使用文件流生成截图。 private function writeDataToImage():void { var filestream:FileStream=new FileStream(); try{ filestream.open(_file,FileMode.WRITE); filestream.writeBytes(_imgByteArray); filestream.close(); }catch(e:Error){ Alert.show(e.message); } } //撤销按钮操作。 protected function btn_cancel_clickHandler(event:MouseEvent):void { if(pop1.indexList.length != 0 && pop1.indexList.length >= 0) { pop1.tempDel.addItem(pop1.indexList.getItemAt(pop1.indexList.length-1)); myPanel.removeChild(pop1.indexList.getItemAt(pop1.indexList.length - 1) as DisplayObject); pop1.indexList.removeItemAt(pop1.indexList.length-1); } } //-----清空白板按钮操作-------- protected function btn_reset_clickHandler(event:MouseEvent):void { myPanel.removeAllChildren(); pop1.indexList.removeAll(); pop1.tempDel.removeAll(); } //------图形恢复按钮操作------- protected function btn_recovery_clickHandler(event:MouseEvent):void { if(pop1.tempDel.length!=0) { pop1.indexList.addItem(pop1.tempDel.getItemAt(pop1.tempDel.length-1)) myPanel.addChild(pop1.tempDel.getItemAt(pop1.tempDel.length-1) as DisplayObject); pop1.tempDel.removeItemAt(pop1.tempDel.length-1); } } //绘图时,鼠标按下操作处理。 private function downHandler(e:MouseEvent):void { _isDown=true; oX = myPanel.mouseX; oY = myPanel.mouseY; sprit=new Sprite(); } //---------绘图时,鼠标释放操作处理。---------- private function upHandler(e:MouseEvent):void { _isDown=false; oX=myPanel.mouseX; oY=myPanel.mouseY; var Num:Number=Number(myPanel.numChildren)-1; if(pop1.spriteFlag!="截屏") { if(Num>=0) { pop1.indexList.addItem(myPanel.getChildAt(myPanel.numChildren-1)); } } else { //截屏操作只需要保存最后一个绘制上去的图形对象。 PrObj=myPanel.getChildAt(myPanel.numChildren-1); } } //-----鼠标移动事件----------- private function moveHandler(e:MouseEvent):void { if(_isDown) { myPanel.graphics.lineStyle(pop1._lineSize,pop1._lineColor,1); //-----生成线----------- if(pop1.spriteFlag=="线"){ sprit.graphics.lineStyle(pop1._lineSize,pop1._lineColor,1);//应用线条样式 sprit.graphics.beginFill(0xffffff,1);//图的内部填充 var x:Number = myPanel.mouseX; var y:Number = myPanel.mouseY; sprit.graphics.moveTo(oX,oY); sprit.graphics.lineTo(x,y); var uiCom:UIComponent=new UIComponent(); uiCom.addChild(sprit); myPanel.addChild(uiCom); oX=x; oY=y; } //---生成圆-------- if(pop1.spriteFlag=="圆"){ sprit.graphics.clear(); sprit.graphics.lineStyle(pop1._lineSize,pop1._lineColor,1); sprit.graphics.beginFill(pop1._fillColor,pop1._fillAlpha); nX = myPanel.mouseX; nY = myPanel.mouseY; var cX:Number=oX+(nX-oX)/2; var cY:Number=oY+(nY-oY)/2; var preX:Number =Math.min(oX,nX); var preY:Number =Math.min(oY,nY); var cWidth:Number = Math.abs(oX - nX); var cHeight:Number = Math.abs(oY- nY); sprit.graphics.drawEllipse(preX,preY,cWidth,cHeight); var uiCom:UIComponent = new UIComponent(); uiCom.addChild(sprit); myPanel.addChild(uiCom); } //----------生成矩形------------- if(pop1.spriteFlag=="矩形"){ sprit.graphics.clear(); sprit.graphics.lineStyle(pop1._lineSize,pop1._lineColor,1); sprit.graphics.beginFill(pop1._fillColor,pop1._fillAlpha); nX=myPanel.mouseX; nY=myPanel.mouseY; sprit.graphics.drawRect(oX,oY,nX-oX,nY-oY); var uiCom:UIComponent = new UIComponent(); uiCom.addChild(sprit); myPanel.addChild(uiCom); } //----------生成截屏区域------------- if(pop1.spriteFlag=="截屏"){ //sprit=new Sprite(); sprit.graphics.clear(); sprit.graphics.lineStyle(pop1._lineSize,pop1._lineColor,1); sprit.graphics.beginFill(pop1._fillColor,pop1._fillAlpha); nX=myPanel.mouseX; nY=myPanel.mouseY; sprit.graphics.drawRect(oX,oY,nX-oX,nY-oY); comUI.addChild(sprit); comUI.width=sprit.width; comUI.height=sprit.height; myPanel.addChild(comUI); } } } //----------移出浮动窗------- private function moveImage(event:MouseEvent):void { myMoveIn.play(); } //----------移走浮动窗------ private function moveout(event:MouseEvent):void{ myMoveOut.play(); } ]]> </mx:Script> <mx:DateFormatter id="df" formatString="YYYY-MM-DD JJ-NN-SS"/> <mx:Move id="myMoveIn" target="{pop1}" duration="300" yTo="0" /> <mx:Move id="myMoveOut" target="{pop1}" duration="300" yTo="-230" /> <mx:Canvas width="100%" height="100%" id="myPanel" borderStyle="solid" fontSize="12" backgroundSize="100%"> </mx:Canvas> </mx:WindowedApplication>
设置面板ConsolePanel.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" width="500" height="242" fontSize="12" creationComplete="canvas1_creationCompleteHandler(event)" alpha="1"> <mx:Script> <![CDATA[ import mx.binding.utils.BindingUtils; import mx.collections.ArrayCollection; import mx.controls.Alert; import mx.events.CollectionEvent; import mx.events.FlexEvent; import mx.utils.ColorUtil; import mx.utils.StringUtil; [Bindable] public var _lineSize:int=1; [Bindable] public var _lineColor:uint=0x000000; [Bindable] public var _fillAlpha:Number=0; [Bindable] public var _fillColor:uint=0xffffff; private var _changeLineFlag:Boolean = false; private var _changeFillFlag:Boolean = false; public var spriteFlag:String="线"; public var indexList:ArrayCollection=new ArrayCollection();//myPanel显示对象 public var tempDel:ArrayCollection=new ArrayCollection();//临时删除对象 private function canvas1_creationCompleteHandler(event:FlexEvent):void { BindingUtils.bindProperty(this,"_lineSize",hs,"value"); BindingUtils.bindProperty(this,"_fillAlpha",fillalpha,"value"); indexList.addEventListener(CollectionEvent.COLLECTION_CHANGE,listChange); tempDel.addEventListener(CollectionEvent.COLLECTION_CHANGE,tempDelChange); } private function listChange(evt:CollectionEvent):void { if(indexList.length==0) { btn_cancel.enabled=false; btn_reset.enabled=false; } else { btn_cancel.enabled=true; btn_reset.enabled=true; } } private function tempDelChange(evt:CollectionEvent):void { if(tempDel.length==0) { btn_recovery.enabled=false; } else { btn_recovery.enabled=true; } } //设置线条颜色和填充颜色时,例如设置线条颜色,需要首先点击线条颜色方块,在点击下方八个颜色方块中的任意一色,可更换线条颜色。 private function changeColor(event:MouseEvent):void { var colorValue:uint = (event.target as GridItem).getStyle("backgroundColor"); // Alert.show("_changeLineFlag :"+_changeLineFlag +" _changeFillFlag : "+_changeFillFlag+" colorValue:"+colorValue); if (_changeLineFlag) { _lineColor = colorValue; } if (_changeFillFlag) { _fillColor = colorValue; } } ]]> </mx:Script> <mx:Canvas id="spritPanelBox" width="100%" height="100%" backgroundColor="#5599AA" alpha="0.6"> <mx:Canvas id="chooseBox" width="472" height="194" x="0" y="0"> <mx:Label text="线条色" fontWeight="bold" x="10" y="18"/> <mx:Label text="填充色" fontWeight="bold" x="129" y="18"/> <mx:Button label="椭圆" id="circle" icon="@Embed(source='img/圆.png')" click="this.spriteFlag='圆';" width="75.2" x="242.8" y="82"/> <mx:Button label="线" id="line" icon="@Embed(source='img/线 .png')" click="this.spriteFlag='线';" width="75.2" x="242.75" y="14"/> <mx:Button label="矩形" id="rect" icon="@Embed(source='img/矩形.png')" click="this.spriteFlag='矩形'" width="75.2" x="242.8" y="48"/> <mx:Button label="截屏" id="prScrn" icon="@Embed(source='img/截屏.png')" x="410" y="39" labelPlacement="bottom"/> <mx:Button label="撤消" id="btn_cancel" icon="@Embed(source='img/撤销.png')" enabled="false" x="326" y="14"/> <mx:Button label="清除" id="btn_reset" icon="@Embed(source='img/清除.png')" enabled="false" x="326" y="48"/> <mx:Button label="恢复" id="btn_recovery" icon="@Embed(source='img/恢复.png')" enabled="false" width="77.5" x="326" y="82"/> <mx:HBox width="100%" horizontalGap="23" verticalGap="0" x="0" y="148" height="39"> <mx:VBox verticalGap="0" width="229" height="39"> <mx:HSlider id="hs" value="{_lineSize}" minimum="1" maximum="20" snapInterval="1" tickInterval="1" liveDragging="true"/> <mx:Label id="lb_lineSize" text="笔刷大小:{hs.value}px"/> </mx:VBox> <mx:VBox verticalGap="0" height="39"> <mx:HSlider id="fillalpha" value="{_fillAlpha}" minimum="0" maximum="1" tickInterval="0.1" snapInterval="0.1" liveDragging="true"/> <mx:Label id="lb_fillAlpha" text="填充区透明度:{fillalpha.value}"/> </mx:VBox> </mx:HBox> <mx:HRule x="0" y="136" width="462" height="1"/> <mx:TextInput id="fillColor" x="180" y="16" width="30" height="25" backgroundColor="{_fillColor}" focusRect="false" editable="false" focusIn="_changeFillFlag = true;" focusOut="_changeFillFlag = false;"/> <mx:TextInput id="lineColor" x="62" y="16" width="30" height="25" backgroundColor="{_lineColor}" focusRect="false" editable="false" focusIn="_changeLineFlag = true;" focusOut="_changeLineFlag = false;"/> <mx:Grid x="10" y="46" width="224.8" height="73"> <mx:GridRow width="100%" height="100%"> <mx:GridItem width="100%" height="100%" backgroundColor="black" click="changeColor(event)"> </mx:GridItem> <mx:GridItem width="100%" height="100%" backgroundColor="white" click="changeColor(event)"> </mx:GridItem> <mx:GridItem width="100%" height="100%" backgroundColor="gray" click="changeColor(event)"> </mx:GridItem> <mx:GridItem width="100%" height="100%" backgroundColor="yellow" click="changeColor(event)"> </mx:GridItem> </mx:GridRow> <mx:GridRow width="100%" height="100%"> <mx:GridItem width="100%" height="100%" backgroundColor="purple" click="changeColor(event)"> </mx:GridItem> <mx:GridItem width="100%" height="100%" backgroundColor="red" click="changeColor(event)"> </mx:GridItem> <mx:GridItem width="100%" height="100%" backgroundColor="green" click="changeColor(event)"> </mx:GridItem> <mx:GridItem width="100%" height="100%" backgroundColor="blue" click="changeColor(event)"> </mx:GridItem> </mx:GridRow> </mx:Grid> </mx:Canvas> </mx:Canvas> </mx:TitleWindow>
相关推荐
7. **API集成**:作为Flex应用,它可能利用了Google Maps API来获取和处理地图数据,同时也可能与其他Google服务(如Geocoding API或Places API)进行集成。 8. **性能优化**:Flex通常比HTML5更擅长处理复杂的图形...
### Flex应用程序开发:深入理解与实践 #### 一、Flex概览 Flex是Adobe Systems Incorporated推出的一款用于构建高质量的Rich Internet Applications(RIA)的开源框架。它基于Flash平台,允许开发者使用标准的Web...
使用 Adobe Flex 3 开发 Adobe AIR 1.1 应用程序
本人经常丢手机。所以做了个电话本,是桌面应用程序。好用。需要安装FLEX相关插件才可安装运行。
Flex桌面应用是基于Adobe Flex技术构建的用于开发桌面应用程序的框架。Adobe Flex最初是一个用于创建富互联网应用程序(RIA)的工具,后来发展出能够构建桌面应用程序的功能,这得益于Adobe AIR(Adobe Integrated ...
- 桌面部署:使用Adobe AIR技术,Flex应用程序可被转换成桌面应用,通过桌面运行。 7. Flex开发流程: - 设计和规划:确定应用需求,设计用户界面和交互流程。 - 编写代码:使用MXML和ActionScript开发应用程序的...
### Flex开发移动设备应用程序知识点概览 #### 一、引言 - **Adobe Flex与Adobe Flash Builder**: Adobe Flex 是一种开源框架,专为构建跨平台的桌面和移动应用程序而设计。Adobe Flash Builder 是一个集成开发环境...
- BlazeDS或LiveCycle Data Services:Adobe提供的中间件,允许Flex应用程序与Java或.NET服务进行数据交换,包括Socket通信。 2. **C#服务端开发**: - `System.Net.Sockets.Socket`类:用于创建和管理Socket连接...
- **构建Flex应用程序**:开发者可以使用Flex框架来构建用户界面,并利用ActionScript添加逻辑处理功能。 - **体验Web和桌面应用程序**:Flex支持创建既可以在Web浏览器中运行也可以打包为独立桌面应用程序的应用。 ...
总结,使用Flex 4.5开发Android应用程序可以借助其强大的UI组件库、良好的编程模型和对原生API的访问能力,实现高效、跨平台的移动应用开发。虽然现在Flex可能不再是主流的Android开发工具,但了解其工作原理和优势...
第五章和第六章可能会探讨FLEX中的数据服务,如AMF通信、Web服务调用和 BlazeDS/LiveCycle Data Services的使用,让FLEX应用程序能够与后端服务器无缝交互,实现数据的获取和更新。 第七章至第九章可能涉及更高级的...
在本文中,我们将深入探讨如何使用Flex SDK创建第一个桌面Adobe Integrated Runtime (AIR)应用程序。首先,确保你已经安装了运行时环境并配置了Flex 3 SDK。主要涉及的工具包括AMXMLC编译器、AIR Debug Launcher ...
- ActionScript是Flex应用程序的主要动力,负责处理所有的业务逻辑和交互行为。 - 对象和类的使用:可能自定义了一些类来封装特定的绘图功能或数据管理。 - 异步通信:如果应用需要保存或加载画作,可能涉及了与...
标题中的“flex画板简单版”指的是一个基于Adobe Flex技术实现的在线绘画应用程序。Flex是一种开源的、基于ActionScript的框架,用于构建富互联网应用程序(RIA)。它允许开发者使用MXML和ActionScript来构建交互式...
Flex和Flash Builder是Adobe提供的两个强大的开发工具,它们被广泛用于开发各种应用程序。在移动设备应用程序的开发中,Flex和Flash Builder扮演着重要的角色。Flex主要负责应用程序的外观和界面设计,而Flash ...
Flex画板实现主要涉及到的是Adobe Flex技术,这是一种用于构建富互联网应用程序(RIA)的开源框架。Flex使用MXML和ActionScript编程语言,基于Flash Player或Adobe AIR运行时环境,能够创建交互性强、视觉效果丰富的...
5. **Graphical Builder (Flash Builder)**:Adobe Flash Builder是用于开发Flex应用的主要IDE,它提供了图形化的界面编辑器,使得开发者可以通过拖放方式创建和布局组件,提高开发效率。 6. **数据绑定**:Flex4中...