2010-05-21 73 views
0

我想幫我的一個小項目。瘋狂的Graphics.lineStyle行爲

背景: 我有一個小小的層次結構的Sprite派生類(從一個層次開始,即Flex Builder中的根應用程序類)。寬度和高度屬性被覆蓋,以便我的類始終記住它所需的大小(不僅限於內容的邊界大小),而且這些屬性顯式地將scaleX和scaleY設置爲1,這樣就不會涉及縮放。在存儲這些值之後,調用draw()方法來重繪內容。

圖紙: 繪圖非常直截了當。僅最深對象(1-索引級別5)繪製的東西進入這樣this.graphics對象:

var gr:Graphics = this.graphics; 
gr.clear(); 

gr.lineStyle(0, this.borderColor, 1, true, LineScaleMode.NONE); 
gr.beginFill(0x0000CC); 
gr.drawRoundRectComplex(0, 0, this.width, this.height, 10, 10, 0, 0); 
gr.endFill(); 

此外上: 還有附加到繪製對象的父MouseEvent.MOUSE_WHEEL事件。什麼處理程序只是調整繪圖對象的大小。

問題: Screenshot

當調整大小有時該細線邊界線與LineScaleMode.NONE設定增益厚度(經常甚至> 10像素)+它經常離開其自身的軌跡(如上面在圖可見和下面的藍色框(注意框本身有一個px黑色邊框))。當我將lineStile厚度設置爲NaN或alpha爲0時,該軌跡不再發生。

我已經回到這個問題,並放棄了一些其他的東西超過一個星期了。

任何想法的人?

P.S.灰色背景是Flash Player本身,而不是我自己的選擇..:D

根據要求,多一點: 應用程序應該是一個帶有縮放「功能」的日曆時間軸(項目爲大學)。因此,我有這些與調整大小有關的功能:

 public function performZoom():void 
     { 
      // Calculate new width: 
      var newDayWidth:Number = view.width/7 * this.calModel.zoom; 
      if (newDayWidth < 1) 
      { 
       newDayWidth = 1; 
      } 
      var newWidth:int = int(newDayWidth * timeline.totalDays); 

      // Calculate day element Height/Width ratio: 
      var headerHeight:Number = this.timeline.headerAllDay; 
      var proportion:Number = 0; 
      if (this.view.width != 0 && this.view.height != 0) 
      { 
       proportion = 1/(this.view.width/7) * (this.view.height - this.timeline.headerAllDay); 
      } 

      // Calculate new height: 
      var newHeight:int = int(newDayWidth * proportion + this.timeline.headerAllDay); 

      // Calculate mouse position scale on X axis: 
      var xScale:Number = 0; 
      if (this.timeline.width != 0) 
      { 
       xScale = newWidth/this.timeline.width; 
      } 

      // Calculate mouse position scale on Y axis: 
      var yScale:Number = 0; 
      if (this.timeline.height - this.timeline.headerAllDay != 0) 
      { 
       yScale = (newHeight - this.timeline.headerAllDay)/(this.timeline.height - this.timeline.headerAllDay); 
      } 

      this.timeline.beginUpdate(); 

      // Resize the timeline 
      this.timeline.resizeElement(newWidth, newHeight); 
      this.timeline.endUpdate(); 

      // Move timeline: 
      this.centerElement(xScale, yScale); 

      // Reset timeline local mouse position: 
      this.centerMouse(); 
     } 

     public function resizeElement(widthValue:Number, heightValue:Number):void 
     { 
      var prevWidth:Number = this.myWidth; 
      var prevHeight:Number = this.myHeight; 

      if (widthValue != prevWidth || heightValue != prevHeight) 
      { 
       super.width = widthValue; 
       super.height = heightValue; 
       this.scaleX = 1.0; 
       this.scaleY = 1.0; 

       this.myHeight = heightValue; 
       this.myWidth = widthValue; 

       if (!this.docking) 
       { 
        this.origHeight = heightValue; 
        this.origWidth = widthValue; 
       } 

       this.updateAnchorMargins(); 

       onResizeInternal(prevWidth, prevHeight, widthValue, heightValue); 
      } 
     } 

是的。我知道......很多核心和很多屬性,但實際上大部分內容已被禁用,情況如上所述。

這並不工作:

gr.lineStyle(); // Reset line style 
+0

還有一件事我只注意到。 ..這個問題似乎只是當我調整窗口的大小比默認大小(獨立播放器)...當我調整窗口,使其更寬/更高,這個問題彈出。如果我把尺寸縮小到原來的大小,這個問題就沒有了。至少在屏幕內不可見。 – Simon 2010-05-21 23:23:15

回答

0

我不知道它是否是閃光的錯誤或它是什麼,但我終於找到了解決辦法。

的事情是,在你得到這樣一言以蔽之調整時,在我的情況:

this.width = this.stage.stageWidth/7 * 365; 

當我切換到最大化窗口this.width收益值86K +。當我將這段代碼畫出水平線,它本身固定:

 var recWidth:Number = this.width; 
     var i:int; 
     var newEnd:Number = 0; 
     for (i = 1; newEnd < recWidth; i++) 
     { 
      newEnd = 100 * i; 
      if (newEnd > recWidth) 
      { 
       newEnd = recWidth; 
      } 
      gr.lineTo(newEnd, 0); 
     } 

我不知道是怎麼回事。這是不方便......

1

我們能看到你的大小調整的代碼?

也可以嘗試清除您的線條樣式以及個夠:

gr.lineStyle(0, this.borderColor, 1, true, LineScaleMode.NONE); 
gr.beginFill(0x0000CC); 
gr.drawRoundRectComplex(0, 0, this.width, this.height, 10, 10, 0, 0); 
gr.endFill(); 
gr.lineStyle();//<---- add this line