Flex 4 - пользовательский индикатор выполнения не обновляет процентное завершение - PullRequest
0 голосов
/ 05 марта 2012

Я пытаюсь создать пользовательский индикатор выполнения, в котором реализованы общие функции, такие как скручивание и настройка общего значения и т. Д.,

Кажется, что все работает, но по какой-то причине процентComplete всегда равно 0 вместо увеличения значения, даже когда я вызываю setProgress ()

Update1:

Кроме того, анимация не вызываетФункция onUpdate (старый код)

Update2:

Если я изменил функцию onUpdate следующим образом, вызывается onComplete, но onUpdateProgress вызывается только один раз

   onUpdate:this.onUpdateProgress(getTimer()),

Старый код (вызов функции изнутри анонимной функции)

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

Это мой пользовательский индикатор Progressbar. 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>

Main mxml

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

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

        }

У меня есть команды трассировки в onUpdateProgress ()

  trace(value,_lastValue,this.percentComplete);
  • текущее значение прогресса, которым я являюсьпрохождение getTimer ()
  • _lastValue is общее значение индикатора выполнения, которое устанавливается при инициализации (getTimer () + длительность * 1000)
  • процентComplete - это состояние выполнения, которое должно увеличиться после setProgress ()

выдает что-то вроде этого

.
.
.
.
.

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

Если вы заметили трассировку, значение увеличивается, но процентComplete равен 0

Может кто-нибудь сказать мне, что мне не хватает?

Ответы [ 2 ]

1 голос
/ 09 марта 2012

Я использовал 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 голосов
/ 05 марта 2012

Попробуйте установить mode = "manual"

ex

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