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; /// /// 开始Loading线程 /// /// 最小1000ms 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 { } } /// /// 结束Loading /// void EndLoading() { IsStartLoading = false; if (mLoadingThead != null) mLoadingThead.Abort(); Progress = 0; mProgressLoadingView.BackgroundColor = UIColor.Clear; } void SetIsNeedRemove() { if (IsNeedRemove) { this.RemoveFromParent(); } } /// /// 结束Loading /// public void HideLoading() { EndLoading(); SetIsNeedRemove(); } /// /// 刷新布局 /// private void RefreshFrame() { (uiView as ProgressLoadingView).InitWithFrameArc(new CoreGraphics.CGRect(base.X, base.Y, base.Width, base.Height)); } /// /// 控件宽度 /// public override int Width { get { return base.Width; } set { base.Width = value; RefreshFrame(); } } /// /// 控件的高度 /// public override int Height { get { return base.Height; } set { base.Height = value; RefreshFrame(); } } /// /// 控件的X坐标 /// public override int X { get { return base.X; } set { base.X = value; RefreshFrame(); } } /// /// 控件的X坐标 /// public override int Y { get { return base.Y; } set { base.Y = value; RefreshFrame(); } } /// /// 当前进度值 /// /// 进度值 public float Progress { set { mProgressLoadingView.Progress = value; } get { return mProgressLoadingView.Progress; } } /// /// 当前进度宽 /// /// 进度值 public int ProgressWidth { set { mProgressLoadingView.ProgressWidth = value; } get { return (int)mProgressLoadingView.ProgressWidth; } } /// /// 当前进度半径 /// /// 进度值 public int ProgressRadius { set { mProgressLoadingView.Radius = value; } get { return (int)mProgressLoadingView.Radius; } } /// /// 进度条颜色 /// /// 单一进度条颜色 public uint ProgressBarColor { set { mProgressLoadingView.mProgressBarColor = HDLUtils.GetUIColorWithUint(value); mProgressLoadingView.SetNeedsDisplay(); } } UIColor mLoadingBackgroundColor = UIColor.Gray; /// /// LoadingBackgroundColor /// /// 背景颜色 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 { /// /// 刷新布局 /// 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(); } } /// /// 点击开始 /// /// Touches. /// Evt. public override void TouchesBegan(NSSet touches, UIEvent evt) { view?.TouchEvent(EventActions.Down, (touches.AnyObject as UITouch).LocationInView(this)); } /// /// 移动 /// /// Touches. /// Evt. public override void TouchesMoved(NSSet touches, UIEvent evt) { view?.TouchEvent(EventActions.Move, (touches.AnyObject as UITouch).LocationInView(this)); } /// /// 点击弹起 /// /// Touches. /// Evt. 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)); } } } }