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;
        }
    }
}

 

posted @ 2016-03-08 21:33  沁河  阅读(539)  评论(0编辑  收藏  举报