我有一段時間以前創建的小型繪圖應用程序。我只是重新打開了項目以添加一些改進,但現在每當我調用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>
我認爲你需要添加更多的上下文來幫助我們。什麼時候startDrawing被調用?什麼時候stopDrawing被調用? clearCanvas()何時被調用?即使您顛倒了所有更改,以前用於工作的應用程序也不再有效,這似乎很不尋常。 – JeffryHouser
謝謝,我在上面增加了一些信息。 –
什麼是圖形?這是一個Flex項目還是僅ActionScript的項目? – JeffryHouser