You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			295 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			295 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			C#
		
	
| 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();
 | |
| 
 | |
|             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);
 | |
|         }
 | |
|     }
 | |
| }
 |