2013-04-02 202 views
0

我有一段時間以前創建的小型繪圖應用程序。我只是重新打開了項目以添加一些改進,但現在每當我調用graphics.clear()時我都無法再繪製。我已經扭轉了我所改變的一切,但無濟於事。這裏是我的自定義繪製組件的相關代碼(基於S:組):在清除Flex中的圖形對象後無法繪製

private var prevX:Number = 0; 
private var prevY:Number = 0; 

private function startDrawing(event:MouseEvent):void { 
    addEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove, false, 0, true); 
} 

private function stopDrawing(event:MouseEvent):void { 
    prevX = 0; 
    prevY = 0; 
    removeEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove, false); 
} 

private function handleMouseMove(event:MouseEvent) { 
    //Set line style using graphics.lineStyle() 

    graphics.moveTo(prevX, prevY); 
    graphics.lineTo(event.localX, event.localY); 

    prevX = event.localX; 
    prevY = event.localY; 
} 

public function clearCanvas():void { 
    //After I call this I can no longer draw. 
    graphics.clear(); 
} 

任何幫助,將不勝感激,謝謝!

編輯:一些附加信息:在MouseDown上調用startDrawing,在MouseUp上調用stopDrawing,並從按鈕按下時調用clearCanvas。我也從Flash Builder 4.6轉到4.7,不確定是否有SDK更改。

編輯:我今天編寫了一些代碼,下面是我想到的。當我點擊並拖動時,我可以看到該行,但出於某種原因無法將其重新繪製到MouseUp的主畫布上。當我追蹤代碼時,它正在傳輸並顯然正確地繪製所有內容(儘管平滑模式尚未運行)。

<?xml version="1.0" encoding="utf-8"?> 
<s:Group xmlns:mx="http://www.adobe.com/2006/mxml" 
     xmlns:local="*" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     mouseEnabledWhereTransparent="true" 
     mouseDown="startDrawing(event)" 
     mouseUp="stopDrawing(event)"> 
    <mx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayCollection; 
      import mx.containers.Canvas; 

      //########## Public Variables ########## 

      public var __DrawingColor:uint = 0x000000; 
      public var __DrawingWidth:Number = 4; 
      public var __DrawingAlpha:Number = 1; 
      public var __DrawingSmoothing:Boolean = false; 

      //########## Private Variables ########## 

      private static const ___SMOOTHING_AMOUNT:Number = 5; 

      private var _History:ArrayCollection; 
      private var _CurrentPoints:Array; 
      private var _LiveCanvas:Canvas; 
      private var _LiveObject:Object; 
      private var _PrevX:Number = 0; 
      private var _PrevY:Number = 0; 

      //########## Public Functions ########## 

      public function init():void{ 
       _History = new ArrayCollection(); 
      } 

      public function clearAll():void { 
       graphics.clear(); 
       _History = new ArrayCollection(); 

       graphics.beginFill(0xffffff, 0); 
       graphics.drawRect(0, 0, width, height); 
       graphics.endFill(); 
      } 

      public function clearLast():void { 
       if (_History.length > 0) { 
        _History.removeItemAt(_History.length - 1); 
        drawLines(_History); 
       } 
      } 

      //########## Private Functions ########## 

      private function startDrawing(event:MouseEvent):void { 
       addEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove, false, 0, true); 
       _CurrentPoints = new Array(); 

       _LiveCanvas = new Canvas(); 
       addElement(_LiveCanvas); 
       _LiveCanvas.x = 0; 
       _LiveCanvas.y = 0; 
       _LiveCanvas.width = this.width; 
       _LiveCanvas.height = this.height; 

       _LiveCanvas.setStyle("backgroundColor", 0xFFFFFF); 
       _LiveCanvas.setStyle("backgroundAlpha", "0"); 
      } 

      private function handleMouseMove(event:MouseEvent):void { 
       if (_PrevX != 0 && _PrevY != 0) { 
        _CurrentPoints.push(new Point(event.localX, event.localY)); 
        _LiveCanvas.graphics.lineStyle(__DrawingWidth, __DrawingColor, __DrawingAlpha); 
        _LiveCanvas.graphics.moveTo(_PrevX, _PrevY); 
        _LiveCanvas.graphics.lineTo(event.localX, event.localY); 
       } 
       _PrevX = event.localX; 
       _PrevY = event.localY; 
      } 

      private function stopDrawing(event:MouseEvent):void { 
       _CurrentPoints.push(new Point(event.localX, event.localY)); 

       _PrevX = 0; 
       _PrevX = 0; 
       this.removeElement(_LiveCanvas); 
       _LiveCanvas = null; 

       if (__DrawingSmoothing) { 
        _CurrentPoints = smoothPoints(_CurrentPoints); 
       } 

       var addItem:Object = new Object(); 
       addItem.color = __DrawingColor; 
       addItem.width = __DrawingWidth; 
       addItem.alpha = __DrawingAlpha; 
       addItem.lines = pointsToLines(_CurrentPoints); 

       _History.addItem(addItem); 
       drawLines(_History); 
       removeEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove, false); 
      } 

      private function smoothPoints(points:Array):Array { 
       var len:uint = points.length; 
       var p:Point; 
       var ret:Array = new Array(); 
       var t:Number = 1/___SMOOTHING_AMOUNT; 
       while (t < 1) { 
        p = getPoint(t, points); 
        ret.push(p); 
        t += 1/___SMOOTHING_AMOUNT; 
       } 
       return ret; 
      } 

      private function pointsToLines(points:Array):Array { 
       var ret:Array = new Array(); 
       var lineObject:Object = new Object(); 
       for (var i:Number = 0; i < points.length; i++) { 
        if (!lineObject.hasOwnProperty("x1")) { 
         lineObject.x1 = Point(points[i]).x; 
         lineObject.y1 = Point(points[i]).y; 
        } else if (!lineObject.hasOwnProperty("x2")) { 
         lineObject.x2 = Point(points[i]).x; 
         lineObject.y2 = Point(points[i]).y; 
        } else { 
         ret.push(lineObject); 
         lineObject = new Object(); 
         lineObject.x1 = Point(points[i]).x; 
         lineObject.y1 = Point(points[i]).y; 
        } 
       } 
       return ret; 
      } 

      private function drawLines(lines:ArrayCollection):void { 
       graphics.clear(); 
       graphics.beginFill(0xFFFFFF, 0); 
       graphics.drawRect(0, 0, width, height); 
       graphics.endFill(); 
       var currentPoints:Object; 
       for (var x:Number = 0; x < lines.length; x++) { 
        currentPoints = lines[x]; 
        graphics.lineStyle(currentPoints.width, currentPoints.color, currentPoints.alpha); 
        for (var i:Number = 0; i < currentPoints.lines.length; i++) { 
         graphics.moveTo(currentPoints.lines[i].x1, currentPoints.lines[i].y1); 
         graphics.lineTo(currentPoints.lines[i].x2, currentPoints.lines[i].y2); 
        } 
       } 
      } 

      private function getPoint(t:Number, points:Array):Point { 
       var x:Number = 0; 
       var y:Number = 0; 
       var n:uint = points.length-1; 
       var factn:Number = factoral(n); 
       for (var i:uint=0;i<=n;i++) { 
        var b:Number = factn/(factoral(i)*factoral(n-i)); 
        var k:Number = Math.pow(1-t, n-i)*Math.pow(t, i); 
        x += b*k*points[i].x; 
        y += b*k*points[i].y; 
       } 
       return new Point(x, y); 
      } 

      private function factoral(value:uint):Number { 
       if (value==0) 
        return 1; 
       var total:Number = value; 
       while (--value>1) 
        total *= value; 
       return total; 
      } 

     ]]> 
    </mx:Script> 
</s:Group> 
+0

我認爲你需要添加更多的上下文來幫助我們。什麼時候startDrawing被調用?什麼時候stopDrawing被調用? clearCanvas()何時被調用?即使您顛倒了所有更改,以前用於工作的應用程序也不再有效,這似乎很不尋常。 – JeffryHouser

+0

謝謝,我在上面增加了一些信息。 –

+0

什麼是圖形?這是一個Flex項目還是僅ActionScript的項目? – JeffryHouser

回答

0

終於明白了,如果有人感興趣,工作代碼會在下面發佈。謝謝!

<?xml version="1.0" encoding="utf-8"?> 
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" 
     xmlns:local="*" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     mouseDown="startDrawing(event)" 
     mouseUp="stopDrawing(event)"> 
    <mx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayCollection; 

      //########## Public Variables ########## 

      public var __DrawingColor:uint = 0x000000; 
      public var __DrawingWidth:Number = 4; 
      public var __DrawingAlpha:Number = 1; 
      public var __DrawingSmoothing:Boolean = false; 

      //########## Private Variables ########## 

      private var _History:ArrayCollection; 
      private var _CurrentPoints:Array; 
      private var _LiveObject:Object; 

      //########## Public Functions ########## 

      public function init():void{ 
       _History = new ArrayCollection(); 
      } 

      public function clearAll():void { 
       graphics.clear(); 
       _History = new ArrayCollection(); 

       graphics.beginFill(0xffffff, 0); 
       graphics.drawRect(0, 0, width, height); 
       graphics.endFill(); 
      } 

      public function clearLast():void { 
       if (_History.length > 0) { 
        _History.removeItemAt(_History.length - 1); 
        drawLines(_History); 
       } 
      } 

      //########## Private Functions ########## 

      private function startDrawing(event:MouseEvent):void { 
       addEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove, false, 0, true); 
       _CurrentPoints = new Array(); 
       _CurrentPoints.push(new Point(event.localX, event.localY)); 
       _LiveCanvas.visible = true; 
       _LiveCanvas.graphics.clear(); 
       _LiveCanvas.graphics.beginFill(0xFFFFFF, 0); 
       _LiveCanvas.graphics.drawRect(0, 0, width, height); 
       _LiveCanvas.graphics.endFill(); 
       _LiveCanvas.graphics.moveTo(event.localX, event.localY); 
      } 

      private function handleMouseMove(event:MouseEvent):void { 
       _CurrentPoints.push(new Point(event.localX, event.localY)); 
       _LiveCanvas.graphics.lineStyle(__DrawingWidth, __DrawingColor, __DrawingAlpha); 
       _LiveCanvas.graphics.lineTo(event.localX, event.localY); 
      } 

      private function stopDrawing(event:MouseEvent):void { 
       removeEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove, false); 
       _CurrentPoints.push(new Point(event.localX, event.localY)); 

       _LiveCanvas.graphics.clear(); 
       _LiveCanvas.visible = false; 

       if (__DrawingSmoothing) { 
        _CurrentPoints = smoothPoints(_CurrentPoints); 
       } 

       var addItem:Object = new Object(); 
       addItem.color = __DrawingColor; 
       addItem.width = __DrawingWidth; 
       addItem.alpha = __DrawingAlpha; 
       addItem.points = _CurrentPoints; 

       _History.addItem(addItem); 
       drawLines(_History); 
      } 

      private function smoothPoints(points:Array):Array { 
       var len:uint = points.length; 
       var p:Point; 
       var ret:Array = new Array(); 
       var t:Number = 1/(points.length); 
       while (t < 1) { 
        p = getPoint(t, points); 
        ret.push(p); 
        t += 1/(points.length); 
       } 
       return ret; 
      } 

      private function drawLines(lines:ArrayCollection):void { 
       graphics.clear(); 
       graphics.beginFill(0xFFFFFF, 0); 
       graphics.drawRect(0, 0, width, height); 
       graphics.endFill(); 
       var currentPoints:Object; 
       for (var x:Number = 0; x < lines.length; x++) { 
        currentPoints = lines[x]; 
        graphics.lineStyle(currentPoints.width, currentPoints.color, currentPoints.alpha); 
        if (currentPoints.points.length > 0) { 
         graphics.moveTo(Point(currentPoints.points[0]).x, Point(currentPoints.points[0]).y); 
         for (var i:Number = 0; i < currentPoints.points.length; i++) { 
          graphics.lineTo(currentPoints.points[i].x, currentPoints.points[i].y); 
         } 
        } 
       } 
      } 

      private function getPoint(t:Number, points:Array):Point { 
       var x:Number = 0; 
       var y:Number = 0; 
       var n:uint = points.length-1; 
       var factn:Number = factoral(n); 
       for (var i:uint=0;i<=n;i++) { 
        var b:Number = factn/(factoral(i)*factoral(n-i)); 
        var k:Number = Math.pow(1-t, n-i)*Math.pow(t, i); 
        x += b*k*points[i].x; 
        y += b*k*points[i].y; 
       } 
       return new Point(x, y); 
      } 

      private function factoral(value:uint):Number { 
       if (value==0) 
        return 1; 
       var total:Number = value; 
       while (--value>1) 
        total *= value; 
       return total; 
      } 

     ]]> 
    </mx:Script> 
    <mx:Canvas id="_LiveCanvas" left="0" right="0" top="0" bottom="0" backgroundAlpha="0" backgroundColor="0xFFFFFF"/> 
</mx:Canvas> 
0

我試圖使用你的代碼,並有同樣的問題。我的解決方案是爲本組填充一種顏色,使其再次接受鼠標事件。

要想沒有背景的變化我用的α= 0

public function clearCanvas():void { 
    graphics.clear(); 

    graphics.beginFill(0xffffff, 0); 
    graphics.drawRect(0, 0, width, height); 
    graphics.endFill(); 
} 

如果它不能幫助你,我會在這裏發佈我的代碼。

+0

感謝您的建議,似乎沒有工作。請參閱我的編輯完整的代碼。 –