酷符网Flex > 正文

使用flex4画直线和圆

2011-01-21 06:25codeif.com

想要画出多条直线或圆,需要有两个画板,暂时分别称为临时画板和底板吧。临时画板主要用来画从鼠标按下到松开这个过程中的图,鼠标送开的时候就要清楚掉临时画板上的图,根据记录的鼠标按下和松开的点的位置,在底板上画出要画的图。

具体代码如下(使用flex4开发):

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx"  width="100%" height="100%">
    <fx:Script>
        <![CDATA[
            import flash.events.MouseEvent;
            import mx.binding.utils.BindingUtils;
            import mx.controls.Alert;
            import mx.core.UIComponent;

            private var mX:Number;
            private var mY:Number;
            private var IsDown:Boolean=false;
            private var sprite:Sprite;
            private var uic:UIComponent;

            public var lineSize:int = 3;
            [Bindable]
            public var lineColor:int=0xccddaa;
            public var type:String = ""; //draw的类型,本例有两种类型:line、circle

            //切换画图类型,需要先移除之前类型的事件监听。
            private function beforeDraw():void {
                if(type != "") {
                    paperFault.removeEventListener(MouseEvent.MOUSE_DOWN,this[type+"DownHandler"]); ////根据类型得出函数名,所以函数命名的时候要遵守type+"事件类型handler"
                    paperFault.removeEventListener(MouseEvent.MOUSE_UP,this[type+"UpHandler"]);
                    paperFault.removeEventListener(MouseEvent.MOUSE_MOVE,this[type+"MoveHandler"]);
                }
                IsDown = false;
            }

            private function DrawLine():void{
                beforeDraw();
                paperFault.addEventListener(MouseEvent.MOUSE_DOWN,lineDownHandler);
                paperFault.addEventListener(MouseEvent.MOUSE_MOVE,lineMoveHandler);
                paperFault.addEventListener(MouseEvent.MOUSE_UP,lineUpHandler);
                BindingUtils.bindProperty(this,"lineColor",cp,"selectedColor");
                type = "line";
            }
            private function lineMoveHandler(e:MouseEvent):void{
                if(IsDown){
                    var x:Number=paper.mouseX;
                    var y:Number=paper.mouseY;

                    paperFault.contentGroup.graphics.clear();
                    paperFault.contentGroup.graphics.lineStyle(lineSize,lineColor,1);

                    paperFault.contentGroup.graphics.moveTo(mX,mY);
                    paperFault.contentGroup.graphics.lineTo(x,y);

                }
            }

            private function lineDownHandler(e:MouseEvent):void{
                IsDown=true;
                mX=paper.mouseX;
                mY=paper.mouseY;
            }   

            private function lineUpHandler(e:MouseEvent):void{
                paper.contentGroup.graphics.lineStyle(lineSize,lineColor,1);

                paper.contentGroup.graphics.moveTo(mX,mY);
                paper.contentGroup.graphics.lineTo(paper.mouseX,paper.mouseY);
                IsDown=false;
            }   

            private function doChange():void{
                lineSize=int(sel.value);
            }

            private function clear():void {
                paperFault.contentGroup.graphics.clear();
                paper.contentGroup.graphics.clear();
            }

            //画圆
            private function drawCircle():void {
                beforeDraw();
                paperFault.addEventListener(MouseEvent.MOUSE_DOWN,circleDownHandler);
                paperFault.addEventListener(MouseEvent.MOUSE_MOVE,circleMoveHandler);
                paperFault.addEventListener(MouseEvent.MOUSE_UP,circleUpHandler);
                BindingUtils.bindProperty(this,"lineColor",cp,"selectedColor");
                type = "circle";
            }

            private function circleDownHandler(e:MouseEvent):void{
                IsDown=true;
                mX=paper.mouseX;
                mY=paper.mouseY;
            }   

            private function circleMoveHandler(event:MouseEvent):void {
                if(IsDown) {
                    var x:Number=paper.mouseX;
                    var y:Number=paper.mouseY;

                    paperFault.contentGroup.graphics.clear();
                    paperFault.contentGroup.graphics.lineStyle(lineSize,lineColor,1);
                    var r:Number = Math.sqrt(Math.pow(x-mX,2)+Math.pow(y-mY,2));
                    paperFault.contentGroup.graphics.drawCircle(x,y,r);
                }
            }

            private function circleUpHandler(event:MouseEvent):void {
                paper.contentGroup.graphics.lineStyle(lineSize,lineColor,1);
                var x:Number=paper.mouseX;
                var y:Number=paper.mouseY;
                var r:Number = Math.sqrt(Math.pow(x-mX,2)+Math.pow(y-mY,2));
                paper.contentGroup.graphics.drawCircle(x,y,r);
                IsDown=false;
            }

        ]]>
    </fx:Script>
    <s:Panel  title="drawing" width="100%" height="100%">
        <s:layout>
            <s:VerticalLayout />
        </s:layout>
        <s:HGroup width="100%">
            <mx:ColorPicker id="cp" selectedColor="{lineColor}"/>
            <s:NumericStepper id="sel" change="doChange()"/>
            <s:Button  label="直线" id="line" click="DrawLine()"/>
            <s:Button  label="画圆" click="drawCircle()"/>
            <s:Button label="clear" click="clear()"/>
        </s:HGroup>
        <s:Panel width="100%" height="100%" title="记事板" fontFamily="中易宋体">
            <s:BorderContainer id="paper"  width="100%" height="100%" contentBackgroundColor="#FFFFFF" chromeColor="#120101" y="0">
                <s:BorderContainer id="paperFault" width="100%" height="100%"  backgroundAlpha="0" borderWeight="0" />
            </s:BorderContainer>
        </s:Panel>
    </s:Panel>
</s:Application>

相关文章

新浪微博 | 淘段子 | 我的博客 | 淘宝店铺 | jnan.org | RSS
Copyright © 2009 - 2011 酷符网