Beispiel #1
0
        private void DrawBox(CGContext context, CGRect trect, float fRadius)
        {
            float fWidth  = (float)trect.Width;
            float fHeight = (float)trect.Height;

            if (fRadius > fWidth / 2.0f)
            {
                fRadius = fWidth / 2.0f;
            }
            if (fRadius > fHeight / 2.0f)
            {
                fRadius = fHeight / 2.0f;
            }

            float fMinX = (float)trect.GetMinX();
            float fMidX = (float)trect.GetMidX();
            float fMaxX = (float)trect.GetMaxX();
            float fMinY = (float)trect.GetMinY();
            float fMidY = (float)trect.GetMidY();
            float fMaxY = (float)trect.GetMaxY();

            context.MoveTo(fMinX, fMidY);
            context.AddArcToPoint(fMinX, fMinY, fMidX / 2, fMinY, fRadius);
            context.AddLineToPoint(fMidX - 5, fMinY);
            context.AddLineToPoint(fMidX, fMinY - 5);
            context.AddLineToPoint(fMidX + 5, fMinY);
            context.AddArcToPoint(fMaxX, fMinY, fMaxX, fMidY, fRadius);
            context.AddArcToPoint(fMaxX, fMaxY, fMidX, fMaxY, fRadius);
            context.AddArcToPoint(fMinX, fMaxY, fMinX, fMidY, fRadius);
        }
Beispiel #2
0
        public static void AddRoundedRectangle(this CGContext context, float x, float y, float width, float height, float cornerRadius)
        {
            nfloat actualRadius = cornerRadius;

            var rect = new CGRect(x, y, width, height);

            if (actualRadius > rect.Width)
            {
                actualRadius = rect.Width / 2;
            }

            if (actualRadius > rect.Height)
            {
                actualRadius = rect.Height / 2;
            }

            var minX = rect.X;
            var minY = rect.Y;
            var maxX = minX + rect.Width;
            var maxY = minY + rect.Height;
            var midX = minX + rect.Width / 2;
            var midY = minY + rect.Height / 2;

            context.MoveTo(minX, midY);
            context.AddArcToPoint(minX, minY, midX, minY, (float)actualRadius);
            context.AddArcToPoint(maxX, minY, maxX, midY, (float)actualRadius);
            context.AddArcToPoint(maxX, maxY, midX, maxY, (float)actualRadius);
            context.AddArcToPoint(minX, maxY, minX, midY, (float)actualRadius);
            context.ClosePath();
        }
Beispiel #3
0
        void AddClosedRoundRectanglePath(RectangleF rect, float radius)
        {
            float minx = rect.Left;
            float midx = (rect.Left + rect.Right) / 2f;
            float maxx = rect.Right;

            float miny = rect.Top;
            float midy = (rect.Top + rect.Bottom) / 2f;
            float maxy = rect.Bottom;

            context.MoveTo(minx, midy);
            context.AddArcToPoint(minx, miny, midx, miny, radius);
            context.AddArcToPoint(maxx, miny, maxx, midy, radius);
            context.AddArcToPoint(maxx, maxy, midx, maxy, radius);
            context.AddArcToPoint(minx, maxy, minx, midy, radius);
            context.ClosePath();
        }
Beispiel #4
0
        public void SSDrawRoundedRect(CGContext context, RectangleF rect, float cornerRadius)
        {
            var minx = rect.GetMinX();
            var midx = rect.GetMidX();
            var maxx = rect.GetMaxX();
            var miny = rect.GetMinY();
            var midy = rect.GetMidY();
            var maxy = rect.GetMaxY();

            context.MoveTo(minx, midy);
            context.AddArcToPoint(minx, miny, midx, miny, cornerRadius);
            context.AddArcToPoint(maxx, miny, maxx, midy, cornerRadius);
            context.AddArcToPoint(maxx, maxy, midx, maxy, cornerRadius);
            context.AddArcToPoint(minx, maxy, minx, midy, cornerRadius);
            context.ClosePath();
            context.FillPath();
        }
Beispiel #5
0
        public static void AddRoundedRectToPath(CGContext context, RectangleF rect, float ovalWidth, float ovalHeight)
        {
            float fw, fh;

            if (ovalWidth == 0 || ovalHeight == 0)
            {
                context.AddRect(rect);
                return;
            }
            context.SaveState();
            context.TranslateCTM(rect.GetMinX(), rect.GetMinY());
            context.ScaleCTM(ovalWidth, ovalHeight);
            fw = rect.Width / ovalWidth;
            fh = rect.Height / ovalHeight;
            context.MoveTo(fw, fh / 2);
            context.AddArcToPoint(fw, fh, fw / 2, fh, 1);
            context.AddArcToPoint(0, fh, 0, fh / 2, 1);
            context.AddArcToPoint(0, 0, fw / 2, 0, 1);
            context.AddArcToPoint(fw, 0, fw, fh / 2, 1);
            context.ClosePath();
            context.RestoreState();
        }
        //utility for drawing rectangle shape
        public void DrawRectShapeInContext(CGContext ctx, CGRect rect)
        {
            ctx.SetFillColor(UIColor.FromRGBA(95.0f / 255.0f, 104.0f / 255.0f, 114.0f / 255.0f, 1.0f).CGColor);
            ctx.SetStrokeColor(UIColor.FromRGBA(95.0f / 255.0f, 104.0f / 255.0f, 114.0f / 255.0f, 1.0f).CGColor);
            ctx.StrokeRect(rect);
            ctx.FillRect(rect);

            // Add rounded rect over plain rect with 4 pixel below the origin y, so that it will visible only the bottom rounded corners
            CGRect cornerRect = new CGRect(rect.X, rect.Y + 4, rect.Width, rect.Height);
            nfloat radius = 4;
            nfloat minx = cornerRect.GetMinX(), midx = cornerRect.GetMidX(), maxx = cornerRect.GetMaxX();
            nfloat miny = cornerRect.GetMinY(), midy = cornerRect.GetMidY(), maxy = cornerRect.GetMaxY();

            ctx.SaveState();
            ctx.MoveTo(minx, miny);
            ctx.AddArcToPoint(minx, miny, midx, miny, radius);
            ctx.AddArcToPoint(maxx, miny, maxx, midy, radius);
            ctx.AddArcToPoint(maxx, maxy, midx, maxy, radius);
            ctx.AddArcToPoint(minx, maxy, minx, midy, radius);
            ctx.ClosePath();
            ctx.DrawPath(CGPathDrawingMode.FillStroke);
            ctx.RestoreState();
        }
Beispiel #7
0
		public static void AddRoundedRectToPath(CGContext context, RectangleF rect, float ovalWidth, float ovalHeight)
		{
			float fw, fh;
			if (ovalWidth == 0 || ovalHeight == 0)
			{
				context.AddRect(rect);
				return;
			}
			context.SaveState();
			context.TranslateCTM(rect.GetMinX(), rect.GetMinY());
			context.ScaleCTM(ovalWidth, ovalHeight);
			fw = rect.Width / ovalWidth;
			fh = rect.Height / ovalHeight;
			context.MoveTo(fw, fh / 2);
			context.AddArcToPoint(fw, fh, fw / 2, fh, 1);
			context.AddArcToPoint(0, fh, 0, fh / 2, 1);
			context.AddArcToPoint(0, 0, fw / 2, 0, 1);
			context.AddArcToPoint(fw, 0, fw, fh / 2, 1);
			context.ClosePath();
			context.RestoreState();
		}
Beispiel #8
0
		public void SSDrawRoundedRect(CGContext context, RectangleF rect, float cornerRadius)
		{
			var minx = rect.GetMinX();
			var midx = rect.GetMidX();
			var maxx = rect.GetMaxX();
			var miny = rect.GetMinY();
			var midy = rect.GetMidY();
			var maxy = rect.GetMaxY();
			context.MoveTo(minx, midy);
			context.AddArcToPoint(minx, miny, midx, miny, cornerRadius);
			context.AddArcToPoint(maxx, miny, maxx, midy, cornerRadius);
			context.AddArcToPoint(maxx, maxy, midx, maxy, cornerRadius);
			context.AddArcToPoint(minx, maxy, minx, midy, cornerRadius);
			context.ClosePath();
			context.FillPath();
		}
	public override void DrawInContext (CGContext context)
	{
		// Drawing with a white stroke color
		context.SetStrokeColor (1, 1, 1, 1);
		// And draw with a blue fill color
		context.SetFillColor (0, 0, 1, 1);
		// Draw them with a 2 stroke width so they are a bit more visible.
		context.SetLineWidth (2);

		// Add an ellipse circumscribed in the given rect to the current path, then stroke it
		context.AddEllipseInRect (new CGRect (30, 30, 60, 60));
		context.StrokePath ();

		// Stroke ellipse convenience that is equivalent to AddEllipseInRect(); StrokePath();
		context.StrokeEllipseInRect (new CGRect (30, 120, 60, 60));

		// Fill rect convenience equivalent to AddEllipseInRect(); FillPath();
		context.FillEllipseInRect (new CGRect (30, 210, 60, 60));

		// Stroke 2 seperate arcs
		context.AddArc (150, 60, 30, 0, (float)Math.PI / 2, false);
		context.StrokePath ();
		context.AddArc (150, 60, 30, (float)(3 * Math.PI / 2), (float)Math.PI, true);
		context.StrokePath ();

		// Stroke 2 arcs together going opposite directions.
		context.AddArc (150, 150, 30, 0, (float)Math.PI / 2, false);
		context.AddArc (150, 150, 30, (float)(3 * Math.PI / 2), (float)Math.PI, true);
		context.StrokePath ();

		// Stroke 2 arcs together going the same direction..
		context.AddArc (150, 240, 30, 0, (float)(Math.PI / 2), false);
		context.AddArc (150, 240, 30, (float)Math.PI, (float)(3 * Math.PI / 2), false);
		context.StrokePath ();

		// Stroke an arc using AddArcToPoint
		CGPoint[] p = {
			new CGPoint (210, 30),
			new CGPoint (210, 60),
			new CGPoint (240, 60),
		};
		context.MoveTo (p [0].X, p [0].Y);
		context.AddArcToPoint (p [1].X, p [1].Y, p [2].X, p [2].Y, 30);
		context.StrokePath ();

		// Show the two segments that are used to determine the tangent lines to draw the arc.
		context.SetStrokeColor (1, 0, 0, 1);
		context.AddLines (p);
		context.StrokePath ();

		// As a bonus, we'll combine arcs to create a round rectangle!

		// Drawing with a white stroke color
		context.SetStrokeColor (1, 1, 1, 1);

		// If you were making this as a routine, you would probably accept a rectangle
		// that defines its bounds, and a radius reflecting the "rounded-ness" of the rectangle.
		var rrect = new CGRect (210, 90, 60, 60);
		var radius = 10;
		// NOTE: At this point you may want to verify that your radius is no more than half
		// the width and height of your rectangle, as this technique degenerates for those cases.

		// In order to draw a rounded rectangle, we will take advantage of the fact that
		// context.AddArcToPoint will draw straight lines past the start and end of the arc
		// in order to create the path from the current position and the destination position.

		// In order to create the 4 arcs correctly, we need to know the min, mid and max positions
		// on the x and y lengths of the given rectangle.
		nfloat minx = rrect.X, midx = rrect.X + rrect.Width / 2, maxx = rrect.X + rrect.Width;
		nfloat miny = rrect.Y, midy = rrect.Y + rrect.Height / 2, maxy = rrect.Y + rrect.Height;

		// Next, we will go around the rectangle in the order given by the figure below.
		//       minx    midx    maxx
		// miny    2       3       4
		// midy   1 9              5
		// maxy    8       7       6
		// Which gives us a coincident start and end point, which is incidental to this technique, but still doesn't
		// form a closed path, so we still need to close the path to connect the ends correctly.
		// Thus we start by moving to point 1, then adding arcs through each pair of points that follows.
		// You could use a similar tecgnique to create any shape with rounded corners.

		// Start at 1
		context.MoveTo (minx, midy);
		// Add an arc through 2 to 3
		context.AddArcToPoint (minx, miny, midx, miny, radius);
		// Add an arc through 4 to 5
		context.AddArcToPoint (maxx, miny, maxx, midy, radius);
		// Add an arc through 6 to 7
		context.AddArcToPoint (maxx, maxy, midx, maxy, radius);
		// Add an arc through 8 to 9
		context.AddArcToPoint (minx, maxy, minx, midy, radius);
		// Close the path
		context.ClosePath ();
		// Fill & stroke the path
		context.DrawPath (CGPathDrawingMode.FillStroke);
	}
Beispiel #10
0
    public override void DrawInContext(CGContext context)
    {
        // Drawing with a white stroke color
        context.SetRGBStrokeColor(1, 1, 1, 1);
        // And draw with a blue fill color
        context.SetRGBFillColor(0, 0, 1, 1);
        // Draw them with a 2 stroke width so they are a bit more visible.
        context.SetLineWidth(2);

        // Add an ellipse circumscribed in the given rect to the current path, then stroke it
        context.AddEllipseInRect(new RectangleF(30, 30, 60, 60));
        context.StrokePath();

        // Stroke ellipse convenience that is equivalent to AddEllipseInRect(); StrokePath();
        context.StrokeEllipseInRect(new RectangleF(30, 120, 60, 60));

        // Fill rect convenience equivalent to AddEllipseInRect(); FillPath();
        context.FillEllipseInRect(new RectangleF(30, 210, 60, 60));

        // Stroke 2 seperate arcs
        context.AddArc(150, 60, 30, 0, (float)Math.PI / 2, false);
        context.StrokePath();
        context.AddArc(150, 60, 30, (float)(3 * Math.PI / 2), (float)Math.PI, true);
        context.StrokePath();

        // Stroke 2 arcs together going opposite directions.
        context.AddArc(150, 150, 30, 0, (float)Math.PI / 2, false);
        context.AddArc(150, 150, 30, (float)(3 * Math.PI / 2), (float)Math.PI, true);
        context.StrokePath();

        // Stroke 2 arcs together going the same direction..
        context.AddArc(150, 240, 30, 0, (float)(Math.PI / 2), false);
        context.AddArc(150, 240, 30, (float)Math.PI, (float)(3 * Math.PI / 2), false);
        context.StrokePath();

        // Stroke an arc using AddArcToPoint
        PointF [] p =
        {
            new PointF(210, 30),
            new PointF(210, 60),
            new PointF(240, 60),
        };
        context.MoveTo(p[0].X, p[0].Y);
        context.AddArcToPoint(p[1].X, p[1].Y, p[2].X, p[2].Y, 30);
        context.StrokePath();

        // Show the two segments that are used to determine the tangent lines to draw the arc.
        context.SetRGBStrokeColor(1, 0, 0, 1);
        context.AddLines(p);
        context.StrokePath();

        // As a bonus, we'll combine arcs to create a round rectangle!

        // Drawing with a white stroke color
        context.SetRGBStrokeColor(1, 1, 1, 1);

        // If you were making this as a routine, you would probably accept a rectangle
        // that defines its bounds, and a radius reflecting the "rounded-ness" of the rectangle.
        var rrect  = new RectangleF(210, 90, 60, 60);
        var radius = 10;
        // NOTE: At this point you may want to verify that your radius is no more than half
        // the width and height of your rectangle, as this technique degenerates for those cases.

        // In order to draw a rounded rectangle, we will take advantage of the fact that
        // context.AddArcToPoint will draw straight lines past the start and end of the arc
        // in order to create the path from the current position and the destination position.

        // In order to create the 4 arcs correctly, we need to know the min, mid and max positions
        // on the x and y lengths of the given rectangle.
        float minx = rrect.X, midx = rrect.X + rrect.Width / 2, maxx = rrect.X + rrect.Width;
        float miny = rrect.Y, midy = rrect.Y + rrect.Height / 2, maxy = rrect.Y + rrect.Height;

        // Next, we will go around the rectangle in the order given by the figure below.
        //       minx    midx    maxx
        // miny    2       3       4
        // midy   1 9              5
        // maxy    8       7       6
        // Which gives us a coincident start and end point, which is incidental to this technique, but still doesn't
        // form a closed path, so we still need to close the path to connect the ends correctly.
        // Thus we start by moving to point 1, then adding arcs through each pair of points that follows.
        // You could use a similar tecgnique to create any shape with rounded corners.

        // Start at 1
        context.MoveTo(minx, midy);
        // Add an arc through 2 to 3
        context.AddArcToPoint(minx, miny, midx, miny, radius);
        // Add an arc through 4 to 5
        context.AddArcToPoint(maxx, miny, maxx, midy, radius);
        // Add an arc through 6 to 7
        context.AddArcToPoint(maxx, maxy, midx, maxy, radius);
        // Add an arc through 8 to 9
        context.AddArcToPoint(minx, maxy, minx, midy, radius);
        // Close the path
        context.ClosePath();
        // Fill & stroke the path
        context.DrawPath(CGPathDrawingMode.FillStroke);
    }