| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 | using System;using UnityEngine;using FairyGUI.Utils;namespace FairyGUI{    /// <summary>    /// GProgressBar class.    /// </summary>    public class GProgressBar : GComponent    {        double _min;        double _max;        double _value;        ProgressTitleType _titleType;        bool _reverse;        GObject _titleObject;        GMovieClip _aniObject;        GObject _barObjectH;        GObject _barObjectV;        float _barMaxWidth;        float _barMaxHeight;        float _barMaxWidthDelta;        float _barMaxHeightDelta;        float _barStartX;        float _barStartY;        public GProgressBar()        {            _value = 50;            _max = 100;        }        /// <summary>        ///         /// </summary>        public ProgressTitleType titleType        {            get            {                return _titleType;            }            set            {                if (_titleType != value)                {                    _titleType = value;                    Update(_value);                }            }        }        /// <summary>        ///         /// </summary>        public double min        {            get            {                return _min;            }            set            {                if (_min != value)                {                    _min = value;                    Update(_value);                }            }        }        /// <summary>        ///         /// </summary>        public double max        {            get            {                return _max;            }            set            {                if (_max != value)                {                    _max = value;                    Update(_value);                }            }        }        /// <summary>        ///         /// </summary>        public double value        {            get            {                return _value;            }            set            {                if (_value != value)                {                    GTween.Kill(this, TweenPropType.Progress, false);                    _value = value;                    Update(_value);                }            }        }        public bool reverse        {            get { return _reverse; }            set { _reverse = value; }        }        /// <summary>        /// 动态改变进度值。        /// </summary>        /// <param name="value"></param>        /// <param name="duration"></param>        public GTweener TweenValue(double value, float duration)        {            double oldValule;            GTweener twener = GTween.GetTween(this, TweenPropType.Progress);            if (twener != null)            {                oldValule = twener.value.d;                twener.Kill(false);            }            else                oldValule = _value;            _value = value;            return GTween.ToDouble(oldValule, _value, duration)                .SetEase(EaseType.Linear)                .SetTarget(this, TweenPropType.Progress);        }        /// <summary>        ///         /// </summary>        /// <param name="newValue"></param>        public void Update(double newValue)        {            float percent = Mathf.Clamp01((float)((newValue - _min) / (_max - _min)));            if (_titleObject != null)            {                switch (_titleType)                {                    case ProgressTitleType.Percent:                        if (RTLSupport.BaseDirection == RTLSupport.DirectionType.RTL)                            _titleObject.text = "%" + Mathf.FloorToInt(percent * 100);                        else                            _titleObject.text = Mathf.FloorToInt(percent * 100) + "%";                        break;                    case ProgressTitleType.ValueAndMax:                        if (RTLSupport.BaseDirection == RTLSupport.DirectionType.RTL)                            _titleObject.text = Math.Round(max) + "/" + Math.Round(newValue);                        else                            _titleObject.text = Math.Round(newValue) + "/" + Math.Round(max);                        break;                    case ProgressTitleType.Value:                        _titleObject.text = "" + Math.Round(newValue);                        break;                    case ProgressTitleType.Max:                        _titleObject.text = "" + Math.Round(_max);                        break;                }            }            float fullWidth = this.width - _barMaxWidthDelta;            float fullHeight = this.height - _barMaxHeightDelta;            if (!_reverse)            {                if (_barObjectH != null)                {                    if (!SetFillAmount(_barObjectH, percent))                        _barObjectH.width = Mathf.RoundToInt(fullWidth * percent);                }                if (_barObjectV != null)                {                    if (!SetFillAmount(_barObjectV, percent))                        _barObjectV.height = Mathf.RoundToInt(fullHeight * percent);                }            }            else            {                if (_barObjectH != null)                {                    if (!SetFillAmount(_barObjectH, 1 - percent))                    {                        _barObjectH.width = Mathf.RoundToInt(fullWidth * percent);                        _barObjectH.x = _barStartX + (fullWidth - _barObjectH.width);                    }                }                if (_barObjectV != null)                {                    if (!SetFillAmount(_barObjectV, 1 - percent))                    {                        _barObjectV.height = Mathf.RoundToInt(fullHeight * percent);                        _barObjectV.y = _barStartY + (fullHeight - _barObjectV.height);                    }                }            }            if (_aniObject != null)                _aniObject.frame = Mathf.RoundToInt(percent * 100);            InvalidateBatchingState(true);        }        bool SetFillAmount(GObject bar, float amount)        {            if ((bar is GImage) && ((GImage)bar).fillMethod != FillMethod.None)                ((GImage)bar).fillAmount = amount;            else if ((bar is GLoader) && ((GLoader)bar).fillMethod != FillMethod.None)                ((GLoader)bar).fillAmount = amount;            else                return false;            return true;        }        override protected void ConstructExtension(ByteBuffer buffer)        {            buffer.Seek(0, 6);            _titleType = (ProgressTitleType)buffer.ReadByte();            _reverse = buffer.ReadBool();            _titleObject = GetChild("title");            _barObjectH = GetChild("bar");            _barObjectV = GetChild("bar_v");            _aniObject = GetChild("ani") as GMovieClip;            if (_barObjectH != null)            {                _barMaxWidth = _barObjectH.width;                _barMaxWidthDelta = this.width - _barMaxWidth;                _barStartX = _barObjectH.x;            }            if (_barObjectV != null)            {                _barMaxHeight = _barObjectV.height;                _barMaxHeightDelta = this.height - _barMaxHeight;                _barStartY = _barObjectV.y;            }        }        override public void Setup_AfterAdd(ByteBuffer buffer, int beginPos)        {            base.Setup_AfterAdd(buffer, beginPos);            if (!buffer.Seek(beginPos, 6))            {                Update(_value);                return;            }            if ((ObjectType)buffer.ReadByte() != packageItem.objectType)            {                Update(_value);                return;            }            _value = buffer.ReadInt();            _max = buffer.ReadInt();            if (buffer.version >= 2)                _min = buffer.ReadInt();            if (buffer.version >= 5)            {                string sound = buffer.ReadS();                if (!string.IsNullOrEmpty(sound))                {                    float volumeScale = buffer.ReadFloat();                    displayObject.onClick.Add(() =>                    {                        NAudioClip audioClip = UIPackage.GetItemAssetByURL(sound) as NAudioClip;                        if (audioClip != null && audioClip.nativeClip != null)                            Stage.inst.PlayOneShotSound(audioClip.nativeClip, volumeScale);                    });                }                else                    buffer.Skip(4);            }            Update(_value);        }        override protected void HandleSizeChanged()        {            base.HandleSizeChanged();            if (_barObjectH != null)                _barMaxWidth = this.width - _barMaxWidthDelta;            if (_barObjectV != null)                _barMaxHeight = this.height - _barMaxHeightDelta;            if (!this.underConstruct)                Update(_value);        }    }}
 |