Flex画夹实现
Flex画板实现~
由于项目要求,需要开发一个基于Flex的白板和共享文档功能。在网上找了一把,基本上没有一个完整的关于白板和文档共享的实例代码,所以干脆自己写了一个,这里贴出基本的画板代码,基于这个画板,结合Red5就可以开发出白板和文档共享了;这里没有包含Red5的实现,需要的自己加上Red5连接和函数调用就OK了。
以上是主页面的代码,详细代码参考src.rar附件~
由于项目要求,需要开发一个基于Flex的白板和共享文档功能。在网上找了一把,基本上没有一个完整的关于白板和文档共享的实例代码,所以干脆自己写了一个,这里贴出基本的画板代码,基于这个画板,结合Red5就可以开发出白板和文档共享了;这里没有包含Red5的实现,需要的自己加上Red5连接和函数调用就OK了。
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="init()" fontSize="12"> <mx:Script> <![CDATA[ import mx.events.FlexEvent; import mx.events.ScrollEvent; import mx.controls.Button; import mx.events.ListEvent; import qflag.ucstar.flex.draw.impl.RectangClearDrawImpl; import qflag.ucstar.flex.draw.impl.TextDrawImpl; import qflag.ucstar.flex.draw.impl.EclipseDrawImpl; import qflag.ucstar.flex.draw.impl.CycleDrawImpl; import mx.core.UIComponent; import qflag.ucstar.flex.draw.impl.RectangDrawImpl; import qflag.ucstar.flex.draw.impl.LineDrawImpl; import qflag.ucstar.flex.draw.IDraw; import mx.utils.URLUtil; import mx.controls.Alert; import org.red5.net.User; import mx.binding.utils.BindingUtils; import mx.managers.CursorManager; //当前画图工具 private var currentDraw:IDraw; //当前北京图片 private var currentImage:Image; //当前文字域 public var currentTextArea:TextArea; private var currentButton:Button; //颜色拾取器的属性绑定 [Bindable] public var _lineSize:Number=3; [Bindable] public var _lineColor:uint=0xff0000; [Bindable] public var _lineColorFill:uint=0x000000; [Bindable] public var _fontColor:uint=0xff0000; [Bindable] public var _fillAlpha:Number=1; //共享文档翻页 private var pageImageBaseUrl:String = "http://192.168.1.6/flex/"; private var pageImageName = "test"; private var pageImageExtend = ".jpg"; private var maxCount:Number = 3; //从0开始,例如3就是(0,1,2,3) private var currentPage:Number = 0; public var SELF_CLIENTID:String = "self"; //客户端本身的ID //获取图像地址 public function getCurrentImageUrl():String { var result:String = pageImageBaseUrl + pageImageName + currentPage + pageImageExtend; return result; } //初始化连接 public function init():void { //将颜色拾取器对象绑定到全局属性中 BindingUtils.bindProperty(this, "_lineSize", hs, "value"); BindingUtils.bindProperty(this, "_fillAlpha", hs_fill, "value"); BindingUtils.bindProperty(this, "_lineColor", cp, "selectedColor"); BindingUtils.bindProperty(this, "_lineColorFill", cp_fill, "selectedColor"); BindingUtils.bindProperty(this, "_fontColor", cp_font_color, "selectedColor"); hs.addEventListener(FlexEvent.VALUE_COMMIT, testValueCommit); //Alert.show(URLUtil.getServerNameWithPort(appurl)); //testImage.load("http://192.168.1.6/flex/test1.jpg"); //初始化画图变量 myPanel.graphics.beginFill(0xffffff); //this.graphics.drawRect(0, 0, this.width, this.height); myPanel.graphics.endFill(); currentImage = new Image(); //imageUi.setStyle("backgroundImage","http://192.168.1.6/flex/test1.jpg"); myPanel.addChild(currentImage); //myPanel.setStyle("backgroundImage","http://192.168.1.6/flex/test1.jpg"); myPanel.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); myPanel.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); myPanel.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); myPanel.addEventListener(ScrollEvent.SCROLL, onScrolling); // log2.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); changeDraw(0); //初始化共享文档信息 initDocument(); } //初始化共享文档信息 public function initDocument():void { currentImage.load(getCurrentImageUrl()); var vPageData:Array = new Array(); for(var i:int = 0; i<maxCount; i++) { vPageData[i] = "第" + (i+1) + "页"; } vPageSelect.dataProvider = vPageData; vPageSelect.addEventListener(ListEvent.CHANGE, onVPageChange); } public function logDebug(str:String):void { log.text = str; } /** * *************************************************** * 鼠标点击、拖动、放开事件 * **/ private function onMouseDown(event:MouseEvent):void { //边缘上的滚动条样式不能添加画板事件 if(myPanel.mouseX > myPanel.width - 20) { return; } if(myPanel.mouseY > myPanel.height - 20) { return; } onDrawDown(myPanel.mouseX,myPanel.mouseY); //soChat.send("onDrawDown", myPanel.mouseX,myPanel.mouseY); //RED5事件 //onDrawDown(event.localX,event.localY); } private function onMouseUp(event:MouseEvent):void { onDrawUp(myPanel.mouseX,myPanel.mouseY); //soChat.send("onDrawUp", myPanel.mouseX,myPanel.mouseY); //RED5事件 //onDrawUp(event.localX,event.localY); } private function onMouseMove(event:MouseEvent):void { onDrawMove(myPanel.mouseX,myPanel.mouseY); //soChat.send("onDrawMove", myPanel.mouseX,myPanel.mouseY); //RED5事件 //onDrawMove(event.localX,event.localY); } public function onKeyUp(event:KeyboardEvent):void { var currentText:String = ""; if(currentTextArea != null) { currentText = currentTextArea.text; } onDrawKeyUp(currentText); //soChat.send("onDrawKeyUp", currentText); //RED5事件 } public function onScrolling(event:ScrollEvent):void { } public function onFoucusOut(event:FocusEvent):void { onDrawFoucusKeyUp(this.currentTextArea.text); //soChat.send("onDrawFoucusKeyUp"); //RED5事件 } /** * *********************************************************** * 触发相应的事件,本地事件通知过来的或者是Red5远程通知过来的事件 * **/ public function onDrawDown(mX:Number, mY:Number):void { this.currentDraw.onDrawDown(SELF_CLIENTID,mX,mY); logDebug("onDrawDown:"+mX+","+mY); } public function onDrawMove(mX:Number, mY:Number):void { this.currentDraw.onDrawMove(SELF_CLIENTID,mX,mY); logDebug("onDrawMove:"+mX+","+mY); } public function onDrawUp(mX:Number, mY:Number):void { this.currentDraw.onDrawUp(SELF_CLIENTID,mX,mY); logDebug("onDrawUp:"+mX+","+mY); } public function onDrawKeyUp(text:String):void { this.currentDraw.onDrawKeyUp(SELF_CLIENTID,text); } public function onDrawFoucusKeyUp(text:String):void { this.currentDraw.onFoucusOut(SELF_CLIENTID,text); } public function onChangeDocument(_page:Number) { this.currentPage = _page; vPageSelect.selectedIndex = _page; currentImage.load(this.getCurrentImageUrl()); } /** * *************************************************** * 按钮事件 * **/ //清除白板 public function onClear():void { this.graphics.lineStyle(0, 0, 0); this.graphics.beginFill(0xffffff, 1); this.graphics.drawRect(0, 0, this.width, this.height); this.graphics.endFill(); this.myPanel.removeAllChildren(); this.myPanel.addChild(currentImage); } private function sendClear():void { //soChat.send("onClear"); onClear(); } private function changeDraw(x:Number):void { switch(x) { case 0: {currentDraw = new LineDrawImpl();currentDraw.init(myPanel);break;} case 1: {currentDraw = new RectangDrawImpl();currentDraw.init(myPanel);break;} case 2: {currentDraw = new CycleDrawImpl();currentDraw.init(myPanel);break;} case 3: {currentDraw = new EclipseDrawImpl();currentDraw.init(myPanel);break;} case 4: {currentDraw = new TextDrawImpl();currentDraw.init(myPanel);break;} case 5: {currentDraw = new RectangClearDrawImpl();currentDraw.init(myPanel);break;} default: {currentDraw = new LineDrawImpl();currentDraw.init(myPanel);break;} } } //翻页动作 private function changeImage(type:Number):void { switch(type) { //向前翻页 case -1: { if(currentPage > 0) { currentPage--; } else { Alert.show("当前页为首页!"); return; } break; } //向后翻页 case 1: { if((currentPage+1) < maxCount) { currentPage++; } else { Alert.show("当前页为末页!"); return; } break; } } onChangeDocument(currentPage); //soChat.send("onChangeDocument", currentPage); //RED5事件 } //选择页面动作 public function onVPageChange(event:ListEvent):void { onChangeDocument(vPageSelect.selectedIndex); //soChat.send("onChangeDocument", currentPage); //RED5事件 } public function testValueCommit(event:FlexEvent):void { Alert.show(""+event+""+this._lineSize); } ]]> </mx:Script> <mx:Panel width="100%" height="100%"> <mx:Canvas id="myPanel" x="113.5" y="83" width="100%" height="90%" buttonMode="true" borderStyle="outset" > <mx:Image id="testImage" alpha="1"></mx:Image> </mx:Canvas> <mx:HBox width="100%"> <mx:Button label="上一页" click="changeImage(-1);"/> <mx:ComboBox id="vPageSelect"></mx:ComboBox> <mx:Button label="下一页" click="changeImage(1);"/> <mx:Button label="画笔" click="changeDraw(0);"/> <mx:Button label="矩形" click="changeDraw(1);"/> <mx:Button label="圆形" click="changeDraw(2);"/> <mx:Button label="椭圆" click="changeDraw(3);"/> <mx:Button label="文字" click="changeDraw(4);"/> <mx:Button label="矩形橡皮" click="changeDraw(5);"/> <mx:Button label="清空内容" click="sendClear();"/> <mx:TextArea id="log" height="51" fontSize="12" wordWrap="false" width="159"/> <mx:TextArea id="log2"/> </mx:HBox> <mx:HBox width="100%"> <mx:VBox> <mx:HBox width="100%"> <mx:Label text="线条大小:"/><mx:HSlider id="hs" value="{_lineSize}" minimum="0" maximum="3" width="100"/> <mx:Label text="线条颜色:"/><mx:ColorPicker id="cp" selectedColor="{_lineColor}"/> </mx:HBox> </mx:VBox> <mx:VBox> <mx:HBox width="100%"> <mx:Label text="填充透明度:"/><mx:HSlider id="hs_fill" value="{_fillAlpha}" minimum="0" maximum="1" width="100"/> <mx:Label text="填充颜色:"/><mx:ColorPicker id="cp_fill" selectedColor="{_lineColorFill}"/> </mx:HBox> </mx:VBox> <mx:VBox> <mx:HBox width="100%"> <mx:Label text="文字颜色:"/><mx:ColorPicker id="cp_font_color" selectedColor="{_fontColor}"/> </mx:HBox> </mx:VBox> </mx:HBox> </mx:Panel> </mx:Application>
以上是主页面的代码,详细代码参考src.rar附件~
1 楼
xyx139
2010-12-15
[size=large]借鉴的意义很大,但是实验的时候发现无法绘图!出错的地方就是“有Canvas的地方不可以绘图,只有Panel和Canvas交界的地方可以绘图”!
可否将整个源码发给小弟,不胜感激![/size]
可否将整个源码发给小弟,不胜感激![/size]