Рисование Кругов На Xamarin.iOS (Xamarin Monotouch) для графического отображения прогресса

поскольку я очень новичок в Xamarin мир и новый для его элементов управления. Я хотел бы добавить круги, чтобы показать ход работы в моем приложении mono touch. Чтобы показать прогресс, я должен отметить дугу в круге. И если возможно, кто-нибудь может помочь мне с образцом кода. Жду ответа, заранее большое спасибо.i like to add image like this with two text filed init

3 ответов


рисование круга на GLContext не так сложно сделать и то же самое, что и в Objective-C или Swift.

я предполагаю, что вы хотите создать свой собственный вид, который вы можете использовать. Для этого просто наследовать от UIView:

public class CircleView : UIView
{
}

теперь, чтобы нарисовать что-нибудь в новом пользовательском представлении, вы хотите переопределить Draw способ:

public override void Draw(RectangleF rect)
{
    base.Draw(rect);
    // draw stuff in here
}

чтобы нарисовать материал, вам нужно получить текущий контекст из UIGraphics, что можно сделать как Итак:

using (var gctx = UIGraphics.GetCurrentContext())
{
    // use gctx to draw stuff
}

на CGContext вы возвращаетесь, очень похоже на Canvas на Android, например. Он имеет вспомогательные методы для рисования дуг, кругов, прямоугольников, точек и многое другое.

Итак, чтобы нарисовать простой круг в этом контексте, вы:

gctx.SetFillColor(UIColor.Cyan.CGColor);
gctx.AddEllipseInRect(rect);

так объединить все, что вы получаете:

public class CircleView : UIView
{
    public override Draw(RectangleF rect)
    {
        base.Draw(rect);
        using (var gctx = UIGraphics.GetCurrentContext())
        {
            gctx.SetFillColor(UIColor.Cyan.CGColor);
            gctx.AddEllipseInRect(rect);
        }
    }
}

вот оно! Ну, не совсем, здесь вам нужно начать думать о том, как вы хотите нарисовать индикатор прогресса. Что я думаю, вероятно работа:

  1. нарисуйте заднюю землю
  2. нарисуйте границы
  3. рассчитать Градусы от прогресса в процентах
  4. используйте Градусы для создания дуги с помощью gctx.AddArc(), который может принять угол и нарисовать дугу.
  5. нарисуйте процент в виде строки в середине

чтобы нарисовать строку, вам нужно будет преобразовать строку в NSAttributedString затем использовать CTLine чтобы нарисовать текст, как:

using(var line = new CTLine(nsAttrString))
    line.Draw(gctx);

Result of the view

using System;
    using UIKit;
    using CoreGraphics;

    namespace CircleTest.Touch
    {
        public class CircleGraph : UIView
        {
            int _radius = 10;
            int _lineWidth = 10;
            nfloat _degrees = 0.0f;
            UIColor _backColor = UIColor.FromRGB(46, 60, 76);
            UIColor _frontColor = UIColor.FromRGB(234, 105, 92);
            //FromRGB (234, 105, 92);

        public CircleGraph (CGRect frame, int lineWidth, nfloat degrees)
        {
            _lineWidth = lineWidth; 
            _degrees = degrees; 
            this.Frame = new CGRect(frame.X, frame.Y, frame.Width, frame.Height);
            this.BackgroundColor = UIColor.Clear; 

        }

        public CircleGraph (CGRect frame, int lineWidth, UIColor backColor, UIColor frontColor)
        {
            _lineWidth = lineWidth;
            this.Frame = new CGRect(frame.X, frame.Y, frame.Width, frame.Height);
            this.BackgroundColor = UIColor.Clear;

        }

        public override void Draw (CoreGraphics.CGRect rect)
        {
            base.Draw (rect);

            using (CGContext g = UIGraphics.GetCurrentContext ()) {
                _radius = (int)( (this.Bounds.Width) / 3) - 8;
                DrawGraph(g, this.Bounds.GetMidX(), this.Bounds.GetMidY());
            };
        }

        public void DrawGraph(CGContext g,nfloat x0,nfloat y0) {
            g.SetLineWidth (_lineWidth);

            // Draw background circle
            CGPath path = new CGPath ();
            _backColor.SetStroke ();
            path.AddArc (x0, y0, _radius, 0, 2.0f * (float)Math.PI, true);
            g.AddPath (path);
            g.DrawPath (CGPathDrawingMode.Stroke);

            // Draw overlay circle
            var pathStatus = new CGPath ();
            _frontColor.SetStroke ();
            pathStatus.AddArc(x0, y0, _radius, 0, _degrees * (float)Math.PI, false);
            g.AddPath (pathStatus);
            g.DrawPath (CGPathDrawingMode.Stroke);
        }
    }
}

на самом деле это то, что я на самом деле должен делать. Его работа для меня

вот как это выглядит. U может создать его как файл класса, и просто u может назначить UIView. Для получения дополнительной справки вы можете использовать этот пример project Pi Graph

[EDIT]: на Draw метод первоначально передал View.Frame x, y к DrawGraph метод. Это должно быть View.Bounds (измененная выше, чтобы отразить это). Помните, что фрейм x, y относится к содержащему супервизору, а границы - к текущему представлению. Это сработало бы, если бы представление было добавлено в 0,0, но как только вы начнете перемещаться по пользовательскому интерфейсу, оно исчезнет. Когда дуг взяты значения для X и y перешли к AddArc нужно в ссылку на текущий вид не родитель суперпанель.


незначительные изменения ответа, предоставленного @SARATH в качестве копирования и вставки, не дали желаемого результата.

изменено _degrees на _percentComplete

исправлен конструктор перегрузки для изменения цветов путем добавления параметра для percentComplete и добавлены отсутствующие назначения переменных-членов для _backColor и _frontColor

добавлено постоянное значение float для рисования полного круга (FULL_CIRCLE)

умножьте _percentComplete на FULL_CIRCLE на получите конечный угол для обеих дуг (с разными направлениями)

расчет радиуса

  public class CircleGraph : UIView
  {
      const float FULL_CIRCLE = 2 * (float)Math.PI;
      int _radius = 10;
      int _lineWidth = 10;
      nfloat _percentComplete = 0.0f;
      UIColor _backColor = UIColor.LightGray; //UIColor.FromRGB(46, 60, 76);
      UIColor _frontColor = UIColor.Green; //UIColor.FromRGB(234, 105, 92);

      public CircleGraph(CGRect frame, int lineWidth, nfloat percentComplete)
      {
         _lineWidth = lineWidth;
         _percentComplete = percentComplete;
         this.Frame = new CGRect(frame.X, frame.Y, frame.Width, frame.Height);
         this.BackgroundColor = UIColor.Clear;

      }

      public CircleGraph(CGRect frame, int lineWidth, nfloat percentComplete, UIColor backColor, UIColor frontColor)
      {
         _lineWidth = lineWidth;
         _percentComplete = percentComplete;
         this.Frame = new CGRect(frame.X, frame.Y, frame.Width, frame.Height);
         this.BackgroundColor = UIColor.Clear;
         _backColor = backColor;
         _frontColor = frontColor;
      }

      public override void Draw(CoreGraphics.CGRect rect)
      {
         base.Draw(rect);

         using (CGContext g = UIGraphics.GetCurrentContext())
         {
            var diameter = Math.Min(this.Bounds.Width, this.Bounds.Height);
            _radius = (int)(diameter / 2) - _lineWidth;

            DrawGraph(g, this.Bounds.GetMidX(), this.Bounds.GetMidY());
         };
      }

      public void DrawGraph(CGContext g, nfloat x, nfloat y)
      {
         g.SetLineWidth(_lineWidth);

         // Draw background circle
         CGPath path = new CGPath();
         _backColor.SetStroke();
         path.AddArc(x, y, _radius, 0, _percentComplete * FULL_CIRCLE, true);
         g.AddPath(path);
         g.DrawPath(CGPathDrawingMode.Stroke);

         // Draw overlay circle
         var pathStatus = new CGPath();
         _frontColor.SetStroke();

         // Same Arc params except direction so colors don't overlap
         pathStatus.AddArc(x, y, _radius, 0, _percentComplete * FULL_CIRCLE, false);
         g.AddPath(pathStatus);
         g.DrawPath(CGPathDrawingMode.Stroke);
      }
   }

пример

var circleGraph = new CircleGraph(circleGraphView.Frame, 20, 0.75f);

CircleGraph на 75%

CircleGraph displaying 75%