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