using System;
|
using System.Threading;
|
using CoreGraphics;
|
using Foundation;
|
using UIKit;
|
|
namespace Shared
|
{
|
public class ProgressLoading : View
|
{
|
|
ProgressLoadingView mProgressLoadingView
|
{
|
get
|
{
|
return uiView as ProgressLoadingView;
|
}
|
set
|
{
|
uiView = value;
|
}
|
}
|
|
|
|
public ProgressLoading()
|
{
|
mProgressLoadingView = new ProgressLoadingView(this) { };
|
LoadingBackgroundColor = 0x30696969;
|
//iosButton.BackgroundColor = UIColor.Clear;
|
}
|
|
Thread mLoadingThead;
|
bool IsStartLoading;
|
/// <summary>
|
/// 开始Loading线程
|
/// </summary>
|
/// <param name="mTime">最小1000ms</param>
|
public void StartLoading(int mTime = 3000)
|
{
|
try
|
{
|
if (mTime < 500) mTime = 500;
|
|
EndLoading();
|
mProgressLoadingView.BackgroundColor = mLoadingBackgroundColor;
|
//Progress = 0;
|
float PP = 0;
|
int count = (int)(mTime * 0.01f);
|
|
mLoadingThead = new Thread((obj) =>
|
{
|
try
|
{
|
IsStartLoading = true;
|
while (PP <= 1 && IsStartLoading)
|
{
|
PP = PP + 0.01f;
|
Application.RunOnMainThread(() =>
|
{
|
Progress = PP;
|
});
|
Thread.Sleep(count);
|
}
|
}
|
catch
|
{
|
|
}
|
finally
|
{
|
IsStartLoading = false;
|
Application.RunOnMainThread(() =>
|
{
|
Progress = 0;
|
mProgressLoadingView.BackgroundColor = UIColor.Clear;
|
SetIsNeedRemove();
|
});
|
}
|
|
});
|
mLoadingThead.Start();
|
}
|
catch
|
{
|
|
}
|
}
|
|
/// <summary>
|
/// 结束Loading
|
/// </summary>
|
void EndLoading()
|
{
|
IsStartLoading = false;
|
if (mLoadingThead != null)
|
mLoadingThead.Abort();
|
|
Progress = 0;
|
mProgressLoadingView.BackgroundColor = UIColor.Clear;
|
|
}
|
|
void SetIsNeedRemove()
|
{
|
if (IsNeedRemove)
|
{
|
this.RemoveFromParent();
|
}
|
}
|
|
/// <summary>
|
/// 结束Loading
|
/// </summary>
|
public void HideLoading()
|
{
|
EndLoading();
|
SetIsNeedRemove();
|
}
|
|
|
|
|
/// <summary>
|
/// 刷新布局
|
/// </summary>
|
private void RefreshFrame()
|
{
|
(uiView as ProgressLoadingView).InitWithFrameArc(new CoreGraphics.CGRect(base.X, base.Y, base.Width, base.Height));
|
}
|
|
|
|
/// <summary>
|
/// 控件宽度
|
/// </summary>
|
public override int Width
|
{
|
get
|
{
|
return base.Width;
|
}
|
set
|
{
|
base.Width = value;
|
RefreshFrame();
|
}
|
}
|
|
|
/// <summary>
|
/// 控件的高度
|
/// </summary>
|
public override int Height
|
{
|
get
|
{
|
return base.Height;
|
}
|
set
|
{
|
base.Height = value;
|
RefreshFrame();
|
}
|
}
|
|
/// <summary>
|
/// 控件的X坐标
|
/// </summary>
|
public override int X
|
{
|
get
|
{
|
return base.X;
|
}
|
set
|
{
|
base.X = value;
|
RefreshFrame();
|
}
|
}
|
|
|
/// <summary>
|
/// 控件的X坐标
|
/// </summary>
|
public override int Y
|
{
|
get
|
{
|
return base.Y;
|
}
|
set
|
{
|
base.Y = value;
|
RefreshFrame();
|
}
|
}
|
|
|
/// <summary>
|
/// 当前进度值
|
/// </summary>
|
/// <value>进度值</value>
|
public float Progress
|
{
|
set
|
{
|
mProgressLoadingView.Progress = value;
|
}
|
get
|
{
|
return mProgressLoadingView.Progress;
|
}
|
}
|
|
|
/// <summary>
|
/// 当前进度宽
|
/// </summary>
|
/// <value>进度值</value>
|
public int ProgressWidth
|
{
|
set
|
{
|
mProgressLoadingView.ProgressWidth = value;
|
}
|
get
|
{
|
return (int)mProgressLoadingView.ProgressWidth;
|
}
|
}
|
|
/// <summary>
|
/// 当前进度半径
|
/// </summary>
|
/// <value>进度值</value>
|
public int ProgressRadius
|
{
|
set
|
{
|
mProgressLoadingView.Radius = value;
|
}
|
get
|
{
|
return (int)mProgressLoadingView.Radius;
|
}
|
}
|
|
/// <summary>
|
/// 进度条颜色
|
/// </summary>
|
/// <value>单一进度条颜色</value>
|
public uint ProgressBarColor
|
{
|
set
|
{
|
mProgressLoadingView.mProgressBarColor = HDLUtils.GetUIColorWithUint(value);
|
mProgressLoadingView.SetNeedsDisplay();
|
}
|
}
|
|
UIColor mLoadingBackgroundColor = UIColor.Gray;
|
/// <summary>
|
/// LoadingBackgroundColor
|
/// </summary>
|
/// <value>背景颜色</value>
|
public uint LoadingBackgroundColor
|
{
|
set
|
{
|
mLoadingBackgroundColor = HDLUtils.GetUIColorWithUint(value);
|
}
|
|
}
|
|
bool isNeedRemove = true;
|
public bool IsNeedRemove
|
{
|
get
|
{
|
return isNeedRemove;
|
|
}
|
set
|
{
|
isNeedRemove = value;
|
}
|
|
}
|
|
|
|
public class ProgressLoadingView : UIKit.UIView
|
{
|
/// <summary>
|
/// 刷新布局
|
/// </summary>
|
public void InitWithFrameArc(CGRect mCGRect)
|
{
|
this.Frame = mCGRect;
|
}
|
|
[Weak] View view;
|
public ProgressLoadingView(View view)
|
{
|
this.view = view;
|
}
|
|
|
float mProgress = 0.0f;
|
public UIColor mProgressBarColor = UIColor.White;
|
public nfloat ProgressWidth = 3;
|
public nfloat Radius = 15;
|
public nfloat StartAngle = (nfloat)(-Math.PI * 0.5);
|
public override void Draw(CGRect rect)
|
{
|
|
base.Draw(rect);
|
|
if (isShow && mProgress > 0)
|
{
|
CGContext ctx = UIGraphics.GetCurrentContext();
|
|
if (ctx == null) return;
|
ctx.SaveState();
|
nfloat xCenter = rect.Size.Width * 0.5f;
|
nfloat yCenter = rect.Size.Height * 0.5f;
|
//mProgressBarColor.SetStroke();
|
mProgressBarColor.SetColor();
|
|
ctx.SetLineWidth(ProgressWidth);
|
ctx.SetLineCap(CGLineCap.Round);
|
nfloat endAngle = (nfloat)(StartAngle + mProgress * Math.PI * 2.0f); // 初始值0.05
|
ctx.AddArc(xCenter, yCenter, Radius, StartAngle, endAngle, false);
|
ctx.StrokePath();
|
|
ctx.RestoreState();
|
}
|
|
|
}
|
|
bool isShow = true;
|
public bool IsShow
|
{
|
get
|
{
|
return isShow;
|
|
}
|
set
|
{
|
isShow = value;
|
SetNeedsDisplay();
|
}
|
|
}
|
|
public float Progress
|
{
|
get
|
{
|
return mProgress;
|
}
|
set
|
{
|
if (value < 0) value = 0.0f;
|
|
if (value > 1) value = 1.0f;
|
|
mProgress = value;
|
|
SetNeedsDisplay();
|
}
|
|
}
|
|
|
|
/// <summary>
|
/// 点击开始
|
/// </summary>
|
/// <param name="touches">Touches.</param>
|
/// <param name="evt">Evt.</param>
|
public override void TouchesBegan(NSSet touches, UIEvent evt)
|
{
|
view?.TouchEvent(EventActions.Down, (touches.AnyObject as UITouch).LocationInView(this));
|
}
|
/// <summary>
|
/// 移动
|
/// </summary>
|
/// <param name="touches">Touches.</param>
|
/// <param name="evt">Evt.</param>
|
public override void TouchesMoved(NSSet touches, UIEvent evt)
|
{
|
view?.TouchEvent(EventActions.Move, (touches.AnyObject as UITouch).LocationInView(this));
|
}
|
|
/// <summary>
|
/// 点击弹起
|
/// </summary>
|
/// <param name="touches">Touches.</param>
|
/// <param name="evt">Evt.</param>
|
public override void TouchesEnded(NSSet touches, UIEvent evt)
|
{
|
view?.TouchEvent(EventActions.Up, (touches.AnyObject as UITouch).LocationInView(this));
|
}
|
|
public override void TouchesCancelled(NSSet touches, UIEvent evt)
|
{
|
view?.TouchEvent(EventActions.Cancel, (touches.AnyObject as UITouch).LocationInView(this));
|
}
|
|
|
}
|
}
|
}
|