2012-03-05 17 views
0

我想創建已普遍實現的功能一樣纏繞自定義進度欄,並設置了總價值等,的Flex 4 - 自定義進度不更新PERCENTCOMPLETE

每一件事情似乎是工作,但由於某些原因, PERCENTCOMPLETE始終爲0,而​​不是增加值,甚至當我打電話setProgress()

UPDATE1:

此外,中間人不愈傷組織納克的onUpdate函數(舊代碼)

UPDATE2:

如果我修改像這樣的onUpdate功能的onComplete被調用,但onUpdateProgress只調用一次

onUpdate:this.onUpdateProgress(getTimer()), 

舊代碼(來電功能從內部匿名功能)

onUpdate:function():void{this.onUpdateProgress(getTimer());} 

這是我的自定義進度條mxml:

<?xml version="1.0" encoding="utf-8"?> 
<mx:ProgressBar xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" 
       indeterminate="false" labelPlacement="center" fontWeight="bold" textDecoration="none" fontStyle="normal" textAlign="center" 
       chromeColor="0xFFFFFF" mode="manual" 
       > 
    <fx:Script> 
     <![CDATA[ 
      import caurina.transitions.Tweener; 

      import flash.utils.getTimer; 
      public var cancel:Boolean = false; 

      public const MESSAGE_TYPE_DELETE:String = "Delete"; 
      public const MESSAGE_TYPE_REMOVE:String = "Remove"; 
      public const MESSAGE_TYPE_COLLECT:String = "Collect"; 
      public const MESSAGE_TYPE_MAINTAIN:String = "Maintain"; 
      public const MESSAGE_TYPE_BUILD:String = "Build"; 
      public const MESSAGE_TYPE_CONSTRUCT:String = "Construct"; 

      private var _orgMessage:String; 
      private var _newMessage:String; 
      private var _completeMessage:String; 

      private var _lastValue:uint; 
      private var _tweenCompleted:Boolean; 


      private function onUpdateProgress(value:Number):void{ 

       var txt:String; 

       if (!cancel){ 

UPDATE3: 下面是我在哪裏設置進度

    this.setProgress(value,_lastValue); 

        if (value == _lastValue){ 
         txt = _completeMessage; 
         _tweenCompleted = true; 
        }else{ 
         txt = _newMessage; 
        }     

        label = txt + ":" + int(this.percentComplete).toString() + "%"; 
        trace(value,_lastValue,this.percentComplete); 
       } 
      } 
      private function onComplete():void{ 
       _tweenCompleted = true; 
       label = _completeMessage + ": 100%"; 
       trace("completed"); 
      } 
      public function startProgress(message:String,duration:int = 2):void{ 

       _tweenCompleted = false; 
       _lastValue = getTimer() + duration * 1000; 
       _newMessage = ((message.charAt(message.length - 1) == "e")?message.substr(0,message.length - 1):message) + "ing"; 
       _completeMessage = "Completed"; 

       Tweener.addTween(this, 
         { 
          time:duration, 
          onUpdate:function():void{this.onUpdateProgress(getTimer());}, 
          onComplete:this.onComplete(), 
          transition:"liner" 
         } 
        ); 
      } 
     ]]> 
    </fx:Script> 
    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 
</mx:ProgressBar> 

主MXML

 protected function startProgress(event:MouseEvent):void 
     { 
      this.removeAllElements(); 
      pb = null; 

      pb = new FGProgressBar(); 
      this.addElement(pb); 
      pb.startProgress("Remove",5); 

     } 

我在onUpdateProgress()trace命令

trace(value,_lastValue,this.percentComplete); 
  • 值爲當前進展值,其中我傳遞getTimer()
  • _lastValue是進度條的總價值,這是在initialzation設置(getTimer()+持續時間* 1000)
  • PERCENTCOMPLETE是如果您發現跟蹤應setProgress後增加()

其priting像這樣

. 
. 
. 
. 
. 

5162 8130 0 
5210 8130 0 
5244 8130 0 
5754 8130 0 
6262 8130 0 
6771 8130 0 
7279 8130 0 
7787 8130 0 
8295 8130 0 

進展情況,該值增加,但PERCENTCOMPLETE是0

有人能告訴我我失蹤了嗎?

+1

什麼是setProgress代碼?我在你的發佈代碼中沒有看到它。 – 2012-03-07 18:23:38

+0

在你的發佈代碼中沒有任何地方你正在爲this.percentComplete做一個任務,所以你如何期望它改變? – 2012-03-07 22:20:38

+0

請參閱** onUpdateProgress(value:Number):void **我設置了進度** this.setProgress(value,_lastValue); **我在代碼之間插入了註釋。請檢查現在 – 2012-03-08 05:48:48

回答

0

嘗試設置模式= 「手動」

<mx:ProgressBar 
    id    = "idPercent" 
    labelPlacement = "center" 
    mode   = "manual"/> 
+0

對不起,我忘了更新。我也設置了,沒有改變,這是一個自定義的進度條(ProgressBar的子類) – 2012-03-06 04:42:11

1

我使用的Flex SDK 4.6.0和代碼爲我工作:

FGProgressBar。MXML

<?xml version="1.0" encoding="utf-8"?> 
<mx:ProgressBar xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/mx" 
      indeterminate="false" labelPlacement="center" fontWeight="bold" textDecoration="none" fontStyle="normal" textAlign="center" 
      chromeColor="0xFFFFFF" mode="manual" 
      > 
<fx:Script> 
    <![CDATA[ 
     import caurina.transitions.Tweener; 

     import flash.utils.getTimer; 
     public var cancel:Boolean = false; 

     public const MESSAGE_TYPE_DELETE:String = "Delete"; 
     public const MESSAGE_TYPE_REMOVE:String = "Remove"; 
     public const MESSAGE_TYPE_COLLECT:String = "Collect"; 
     public const MESSAGE_TYPE_MAINTAIN:String = "Maintain"; 
     public const MESSAGE_TYPE_BUILD:String = "Build"; 
     public const MESSAGE_TYPE_CONSTRUCT:String = "Construct"; 

     private var _orgMessage:String; 
     private var _newMessage:String; 
     private var _completeMessage:String; 

     private var _lastValue:uint; 
     private var _tweenCompleted:Boolean; 


     private function onUpdateProgress(value:Number):void{ 

      var txt:String; 

      if (!cancel){ 
       this.setProgress(value,_lastValue); 

       if (value == _lastValue){ 
        txt = _completeMessage; 
        _tweenCompleted = true; 
       }else{ 
        txt = _newMessage; 
       }     

       label = txt + ":" + int(this.percentComplete).toString() + "%"; 
       trace(value,_lastValue,this.percentComplete); 
      } 
     } 
     private function onComplete():void{ 
      _tweenCompleted = true; 
      label = _completeMessage + ": 100%"; 
      trace("completed"); 
     } 
     public function startProgress(message:String,duration:int = 2):void{ 

      _tweenCompleted = false; 
      _lastValue = getTimer() + duration * 1000; 
      _newMessage = ((message.charAt(message.length - 1) == "e")?message.substr(0,message.length - 1):message) + "ing"; 
      _completeMessage = "Completed"; 

      Tweener.addTween(this, 
       { 
        time:duration, 
        onUpdate:function():void{this.onUpdateProgress(getTimer());}, 
        onComplete:this.onComplete(), 
        transition:"liner" 
       } 
      ); 
     } 
    ]]> 
</fx:Script> 
<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 
</mx:ProgressBar> 

Main.mxml

<?xml version="1.0"?> 
<s:Application 
xmlns:fx="http://ns.adobe.com/mxml/2009" 
xmlns:mx="library://ns.adobe.com/flex/mx" 
xmlns:s="library://ns.adobe.com/flex/spark" 
height="600"> 
<fx:Script><![CDATA[ 

    protected function startProgress(event:MouseEvent):void 
    { 
     this.removeAllElements(); 
     var pb:FGProgressBar = null; 

     pb = new FGProgressBar(); 
     this.addElement(pb); 
     pb.startProgress("Remove",5);   
    } 

]]></fx:Script> 

<s:Button click="startProgress(event)"/> 
</s:Application> 
+0

它的工作原理是什麼?對不起,我很難跟蹤變化,如果你有任何 – 2012-03-09 14:07:29

+0

它正在工作。我沒有更改您的自定義ProgressBar代碼中的任何內容。也許問題是你使用的SDK。你使用什麼版本? – Engineer 2012-03-09 14:10:40

+0

我使用的是flex 4.0 – 2012-03-09 14:11:29