xamarin.ios 实现圆形进度条
using System; using UIKit; using System.Drawing; using CoreAnimation; namespace PMM { public class ProgressCircleView : UIView { protected CAShapeLayer _progressCircle; protected CAShapeLayer PageGrayCircle; public override CoreGraphics.CGRect Bounds { get { return base.Bounds; } set { base.Bounds = value; GrayCircle (); } } public ProgressCircleView () { GrayCircle (); } /// <summary> /// Redraws the progress circle. If the circle is already on the screen, it removes that one and creates a new one using the /// current properties of the view /// </summary> void RedrawCircle () { var centerPoint = new PointF ((float)this.Bounds.Width , (float)this.Bounds.Height ); UIBezierPath circlePath = UIBezierPath.FromArc (centerPoint, this.Bounds.Width * .5f, (float)(-.5 * Math.PI), (float)(1.5 * Math.PI), true); _progressCircle = new CAShapeLayer (); _progressCircle.Path = circlePath.CGPath; _progressCircle.StrokeColor = UIColor.Red.CGColor; _progressCircle.FillColor = UIColor.Clear.CGColor; _progressCircle.LineWidth = 5f; _progressCircle.LineCap = CAShapeLayer.CapRound; _progressCircle.StrokeStart = 0f; _progressCircle.StrokeEnd = 0f; this.Layer.AddSublayer (_progressCircle); } void GrayCircle() { if (_progressCircle != null && _progressCircle.SuperLayer != null) { _progressCircle.RemoveFromSuperLayer (); } var centerPoint = new PointF ((float)this.Bounds.Width , (float)this.Bounds.Height ); UIBezierPath circlePath = UIBezierPath.FromArc (centerPoint, this.Bounds.Width * .5f, (float)(1.5 * Math.PI), (float)(-.5 * Math.PI), false); PageGrayCircle = new CAShapeLayer (); PageGrayCircle.Path = circlePath.CGPath; PageGrayCircle.StrokeColor = UIColor.Gray.CGColor; PageGrayCircle.FillColor = UIColor.Clear.CGColor; PageGrayCircle.LineWidth = 4f; PageGrayCircle.LineCap = CAShapeLayer.CapRound; PageGrayCircle.StrokeStart = 0f; PageGrayCircle.StrokeEnd = 0f; this.Layer.AddSublayer (PageGrayCircle); RedrawCircle (); } /// <summary> /// Updates the progress circle. /// </summary> /// <param name="progressPercent">The percentage of the progress. Should be a value between 0.0 and 1.0</param> public void UpdateProgress(float progressPercent) { _progressCircle.StrokeEnd = progressPercent; PageGrayCircle.StrokeEnd = 1 - progressPercent; } } }