protected void DrawShape(Canvas canvas) { Paint paint = new Paint(); paint.Color = Color; switch (Shape) { case ShapeEnum.RectangleShape: canvas.DrawRect(0, 0, ShapeWidth, ShapeHeight, paint); break; case ShapeEnum.OvalShape: canvas.DrawOval(new RectF(0, 0, ShapeWidth, ShapeHeight), paint); break; case ShapeEnum.TriangleShape: Path path = new Path(); path.MoveTo(ShapeWidth / 2, 0); path.LineTo(ShapeWidth, ShapeHeight); path.LineTo(0,ShapeHeight); path.Close(); canvas.DrawPath(path, paint); break; default: canvas.DrawCircle(ShapeWidth / 2, ShapeHeight / 2, ShapeWidth / 2, paint); break; } }
public override void Draw(Android.Graphics.Canvas canvas) { base.Draw(canvas); var rect = new RectF(0,0,300,300); switch (TheShape) { case Shape.Circle: canvas.DrawOval(rect, new Paint() { Color = Color.Aqua }); break; case Shape.Square: canvas.DrawRect(rect, new Paint() { Color = Color.Red }); break; case Shape.Triangle: var path = new Path(); path.MoveTo(rect.CenterX(), 0); path.LineTo(0, rect.Height()); path.LineTo(rect.Width(), rect.Height()); path.Close(); var paint = new Paint() {Color = Color.Magenta}; paint.SetStyle(Paint.Style.Fill); canvas.DrawPath(path, paint); break; default: throw new ArgumentOutOfRangeException(); } }
protected override void OnDraw(Android.Graphics.Canvas canvas) { var rect = new RectF(0, 0, 300, 300); switch (Shape) { case Shape.Circle: canvas.DrawOval(rect, new Paint() { Color = Color.CornflowerBlue }); break; case Shape.Square: canvas.DrawRect(rect, new Paint() { Color = Color.Crimson }); break; case Shape.Triangle: var path = new Path(); path.MoveTo(rect.CenterX(), rect.Top); path.LineTo(rect.Left, rect.Bottom); path.LineTo(rect.Right, rect.Bottom); path.Close(); var paint = new Paint() {Color = Color.Crimson}; paint.Color = Color.Gold; paint.SetStyle(Paint.Style.Fill); canvas.DrawPath(path, paint); break; default: throw new ArgumentOutOfRangeException(); } }
protected override bool DrawChild(Canvas canvas, global::Android.Views.View child, long drawingTime) { try { var radius = Math.Min(Width, Height) / 2; var strokeWidth = 10; radius -= strokeWidth / 2; //Create path to clip var path = new Path(); path.AddCircle(Width / 2, Height / 2, radius, Path.Direction.Ccw); canvas.Save(); canvas.ClipPath(path); var result = base.DrawChild(canvas, child, drawingTime); canvas.Restore(); // Create path for circle border path = new Path(); path.AddCircle(Width / 2, Height / 2, radius, Path.Direction.Ccw); var paint = new Paint(); paint.AntiAlias = true; paint.StrokeWidth = 5; paint.SetStyle(Paint.Style.Stroke); paint.Color = global::Android.Graphics.Color.White; canvas.DrawPath(path, paint); //Properly dispose paint.Dispose(); path.Dispose(); return result; } catch (Exception ex) { Console.WriteLine("Unable to create circle image: " + ex); } return base.DrawChild(canvas, child, drawingTime); }
public void DrawStopwatch(Canvas canvas) { canvas.Save(); canvas.Translate(Width / 2F, Height / 2F); var tickMarks = new Path(); tickMarks.AddCircle(0, 0, 90, Path.Direction.Cw); var scale = Math.Min(Width, Height) / 2F / 120; canvas.Scale(scale, scale); var paint = new Paint { StrokeCap = Paint.Cap.Square, Color = new Color(240, 240, 240) }; paint.SetStyle(Paint.Style.Stroke); paint.StrokeWidth = 3; paint.SetPathEffect(MinuteDashEffect); canvas.DrawPath(tickMarks, paint); paint.Color = new Color(240, 240, 240); paint.StrokeWidth = 4; paint.SetPathEffect(FifthMinuteDashEffect); canvas.DrawPath(tickMarks, paint); }
public DrawingImageView(Context context, Fragment fragment): base(context) { mPaint = new Paint(); mPaint.AntiAlias = true; mPaint.Dither = true; mPaint.Color = Color.Yellow; mPaint.SetStyle (Paint.Style.Stroke); mPaint.StrokeJoin = Paint.Join.Round; mPaint.StrokeCap = Paint.Cap.Round; mPaint.StrokeWidth = 10; cPaint = new Paint (); cPaint.Color = Color.Yellow; cPaint.StrokeJoin = Paint.Join.Round; cPaint.StrokeCap = Paint.Cap.Round; cPaint.SetTypeface(Typeface.Default); cPaint.TextSize = 40; mPath = new Android.Graphics.Path(); mBitmapPaint = new Paint(); mBitmapPaint.Color = Color.Yellow; DrawingStatus = DrawingType.None; _fragment = fragment; }
/// <summary> /// /// </summary> /// <param name="canvas"></param> /// <param name="child"></param> /// <param name="drawingTime"></param> /// <returns></returns> protected override bool DrawChild(Canvas canvas, Android.Views.View child, long drawingTime) { try { var radius = Math.Min(Width, Height) / 2; var strokeWidth = ((CircleImage)Element).BorderThickness; radius -= strokeWidth / 2; var path = new Path(); path.AddCircle(Width / 2, Height / 2, radius, Path.Direction.Ccw); canvas.Save(); canvas.ClipPath(path); var paint = new Paint(); paint.AntiAlias = true; paint.SetStyle(Paint.Style.Fill); paint.Color = ((CircleImage)Element).FillColor.ToAndroid(); canvas.DrawPath(path, paint); paint.Dispose(); var result = base.DrawChild(canvas, child, drawingTime); canvas.Restore(); path = new Path(); path.AddCircle(Width / 2, Height / 2, radius, Path.Direction.Ccw); var thickness = ((CircleImage)Element).BorderThickness; if(thickness > 0.0f) { paint = new Paint(); paint.AntiAlias = true; paint.StrokeWidth = thickness; paint.SetStyle(Paint.Style.Stroke); paint.Color = ((CircleImage)Element).BorderColor.ToAndroid(); canvas.DrawPath(path, paint); paint.Dispose(); } path.Dispose(); return result; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine("Unable to create circle image: " + ex); } return base.DrawChild(canvas, child, drawingTime); }
/// <summary> /// Initializes a new instance of the <see cref="CanvasRenderContext" /> class. /// </summary> /// <param name="scale">The scale.</param> public CanvasRenderContext(double scale) { this.paint = new Paint(); this.path = new Path(); this.bounds = new Rect(); this.pts = new List<float>(); this.Scale = scale; }
protected override bool DrawChild(Canvas canvas, View child, long drawingTime) { try { var radius = Math.Min(Width, Height) / 2; var borderThickness = (float)((CircleImage)Element).BorderThickness; int strokeWidth = 0; if (borderThickness > 0) { var logicalDensity = Xamarin.Forms.Forms.Context.Resources.DisplayMetrics.Density; strokeWidth = (int)Math.Ceiling(borderThickness * logicalDensity + .5f); } radius -= strokeWidth / 2; var path = new Path(); path.AddCircle(Width / 2.0f, Height / 2.0f, radius, Path.Direction.Ccw); canvas.Save(); canvas.ClipPath(path); var paint = new Paint(); paint.AntiAlias = true; paint.SetStyle(Paint.Style.Fill); paint.Color = ((CircleImage)Element).FillColor.ToAndroid(); canvas.DrawPath(path, paint); paint.Dispose(); var result = base.DrawChild(canvas, child, drawingTime); canvas.Restore(); path = new Path(); path.AddCircle((float) Width / 2, (float) Height / 2, radius, Path.Direction.Ccw); if (strokeWidth > 0.0f) { paint = new Paint {AntiAlias = true, StrokeWidth = strokeWidth}; paint.SetStyle(Paint.Style.Stroke); paint.Color = ((CircleImage)Element).BorderColor.ToAndroid(); canvas.DrawPath(path, paint); paint.Dispose(); } path.Dispose(); return result; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine("Unable to create circle image: " + ex); } return base.DrawChild(canvas, child, drawingTime); }
public SvgPath (Path path, Paint paint) { this.path = path; this.paint = paint; measure = new PathMeasure (path, false); length = measure.Length; region.SetPath (path, maxClip); bounds = region.Bounds; }
internal static Path parse(float[] pPoints) { Path path = new Path(); path.MoveTo(pPoints[0], pPoints[1]); for (int i = 2; i < pPoints.Length; i += 2) { float x = pPoints[i]; float y = pPoints[i + 1]; path.LineTo(x, y); } return path; }
private void ShowPath(Canvas canvas, int x, int y, Path.FillType ft, Paint paint) { canvas.Save(); canvas.Translate(x, y); canvas.ClipRect(0, 0, 120, 120); canvas.DrawColor(Color.White); mPath.SetFillType(ft); canvas.DrawPath(mPath, paint); canvas.Restore(); }
public Path BuildPath (float animationProgress, float animationSeek) { Path path = null; if (base.Value.StartAngle <= animationSeek) { path = new Path (); var sweepAngle = CalculateSweepAngle (animationSeek, base.Value); path.AddArc (base.DrawingArea, base.Value.StartAngle, sweepAngle); } return path; }
public Path BuildPath (float animationProgress, float animationSeek) { var startAngle = FitChart.StartAngle; var valueSweepAngle = base.Value.StartAngle + base.Value.SweepAngle; valueSweepAngle -= startAngle; var sweepAngle = valueSweepAngle * animationProgress; var path = new Path (); path.AddArc (base.DrawingArea, startAngle, sweepAngle); return path; }
public void Initialize() { _minuteHand = new Path(); _minuteHand.MoveTo(0, 10); _minuteHand.LineTo(0, -55); _minuteHand.Close(); _secondHand = new Path(); _secondHand.MoveTo(0, -80); _secondHand.LineTo(0, 15); _secondHand.Close(); }
void Initialize() { drawPath = new Path(); drawPaint = new Paint(); drawPaint.Color = Color.Black; drawPaint.AntiAlias=true; drawPaint.StrokeWidth =20; drawPaint.SetStyle(Paint.Style.Stroke); drawPaint.StrokeJoin = Paint.Join.Round; drawPaint.StrokeCap = Paint.Cap.Round; canvasPaint = new Paint(PaintFlags.Dither); DrawingCacheEnabled = true; }
/// <summary> /// Redraws the child. /// </summary> protected override bool DrawChild(Canvas canvas, global::Android.Views.View child, long drawingTime) { try { var radius = (float)((RoundedImage)Element).BorderRadius; var stroke = (float)((RoundedImage)Element).BorderThickness; var delta = (float)stroke / 2.0f; if (radius < 0) { radius = Math.Min(Width, Height) / 2.0f; } radius -= delta; // Clip with rounded rect var path = new Path(); path.AddRoundRect(new RectF(delta, delta, Width - stroke, Height - stroke), radius, radius, Path.Direction.Ccw); canvas.Save(); canvas.ClipPath(path); path.Dispose(); var result = base.DrawChild(canvas, child, drawingTime); canvas.Restore(); // Add stroke for smoother border path = new Path(); path.AddRoundRect(new RectF(delta, delta, Width - stroke, Height - stroke), radius, radius, Path.Direction.Ccw); var paint = new Paint(); paint.AntiAlias = true; paint.StrokeWidth = stroke; paint.SetStyle(Paint.Style.Stroke); paint.Color = ((RoundedImage)Element).BorderColor.ToAndroid(); canvas.DrawPath(path, paint); paint.Dispose(); // Clean up path.Dispose(); return result; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine("Unable to create circle image: " + ex); } return base.DrawChild(canvas, child, drawingTime); }
/// <Docs>The Canvas to which the View is rendered.</Docs> /// <summary> /// Draw the specified canvas. /// </summary> /// <param name="canvas">Canvas.</param> public override void Draw (Canvas canvas) { try { var element = Element as RoundCornerView; var cornerRadius = (float)element.CornerRadius*Resources.DisplayMetrics.Density; // Paint rounded rect itself canvas.Save(); var paint = new Paint(); paint.AntiAlias = true; var strokeWidth = (((float)element.BorderWidth)*Resources.DisplayMetrics.Density); paint.StrokeWidth = strokeWidth; if(element.BackgroundColor != Xamarin.Forms.Color.Transparent) { paint.SetStyle(Paint.Style.Fill); paint.Color = element.BackgroundColor.ToAndroid(); canvas.DrawRoundRect(new RectF(0, 0, Width, Height), cornerRadius, cornerRadius, paint); } if(element.BorderColor != Xamarin.Forms.Color.Transparent) { paint.SetStyle(Paint.Style.Stroke); paint.Color = element.BorderColor.ToAndroid(); canvas.DrawRoundRect(new RectF(0, 0, Width, Height), cornerRadius, cornerRadius, paint); } //Properly dispose paint.Dispose(); canvas.Restore(); // Create clip path var path = new Path(); path.AddRoundRect(new RectF(0.0f + (strokeWidth/2), 0.0f + (strokeWidth/2), Width - (strokeWidth/2), Height - (strokeWidth/2)), cornerRadius, cornerRadius, Path.Direction.Cw); canvas.Save(); canvas.ClipPath(path); // Do base drawing for(var i=0; i<ChildCount; i++) GetChildAt(i).Draw(canvas); canvas.Restore(); path.Dispose(); } catch (Exception) { } }
public CreateAnimationDrawer(Context c, BrushItem brush, Canvas canvas, Bitmap myBmp, bool tooAdd = false, int cell = 1, string DrawerState = "brush_selection", Path pathToUse = null) : base(c) { myBitmap = myBmp; myCanvas = canvas; DrawerStateInternal = DrawerState; addOnly = tooAdd; status = 0; myPath = new Path(); myPaint = new Paint(PaintFlags.Dither); myPaint.AntiAlias = true; myPaint.Dither = true; myPaint.SetStyle(Paint.Style.Stroke); myPaint.StrokeJoin = Paint.Join.Round; myPaint.StrokeWidth = brush.Thickness; myPaint.StrokeCap = Paint.Cap.Round; myPaint.SetARGB(colorUtil.a, colorUtil.r, colorUtil.g, colorUtil.b); if (brush.BrushType == AnimationTypesBrushType.Spray) myPaint.SetShadowLayer(brush.Thickness, 0, 0, ImageHelper.convWZColorToColor(brush.BrushColor)); if (DrawerState == "brush_selection") { if (pathToUse != null) { myBoundsPaint = new Paint(); myBoundsPaint = new Paint(PaintFlags.Dither); myBoundsPaint.AntiAlias = true; myBoundsPaint.Dither = true; myBoundsPaint.SetStyle(Paint.Style.Stroke); myBoundsPaint.StrokeJoin = Paint.Join.Round; myBoundsPaint.StrokeWidth = 10f; myBoundsPaint.StrokeCap = Paint.Cap.Round; myBoundsPaint.SetARGB(255, 0, 0, 0); myBoundsPaint.SetPathEffect(new DashPathEffect(new float[] { 10f, 20f }, 0)); myPath = pathToUse; AnimationUtil.theCanvas.DrawPath(myPath, myPaint); AnimationUtil.theCanvas.DrawPath(myPath, myPaint); myBoundsRect = new RectF(); myPath.ComputeBounds(myBoundsRect, true); AnimationUtil.theCanvas.DrawRect(myBoundsRect, myBoundsPaint); } } }
/// <Docs>The Canvas to which the View is rendered.</Docs> /// <summary> /// BoxViewのカスタマイズはDrawで行う /// </summary> /// <param name="canvas">Canvas.</param> public override void Draw(Android.Graphics.Canvas canvas) { // 2重に描画してしまうので、baseは描画しない //base.Draw(canvas); // ElementをキャストしてFormsで定義したCustomBoxViewを取得 var formsBox = (CustomBoxView)Element; // Androidの描画はPaintを使用 using (var paint = new Paint()) { // 塗りつぶし色の設定 paint.Color = formsBox.FillColor.ToAndroid(); // 吹き出し部分の設定 // パスの生成 var path = new Path(); // スタート地点の設定 path.MoveTo(0, 0); // 経由地点の設定 path.LineTo(100, 10); path.LineTo(100, 100); // パスを繋げる path.Close(); // 描画 canvas.DrawPath(path, paint); // 角の丸い四角の設定 // 角丸の直径を決める // widthとheightを比較して小さい方を基準にする var minSize = Math.Min(Width, Height); // 指定するのは直径なので、指定半径を2倍する var diameter = formsBox.Radius * 2; // 角丸の直径はminSize以下でなければならない if (diameter > minSize) diameter = minSize; // 描画領域の設定 var rect = new RectF(0, 0, (float)Width, (float)Height); //四角形描画 canvas.DrawRoundRect(rect, diameter, diameter, paint); } }
public DrawTest(Context context) : base(context){ drawPath = new Path (); drawPaint = new Paint (); drawPaint.AntiAlias = true; drawPaint.StrokeWidth = 15; drawPaint.SetStyle (Paint.Style.Stroke); drawPaint.StrokeJoin = Paint.Join.Round; drawPaint.StrokeCap = Paint.Cap.Round; canvasPaint = new Paint (PaintFlags.Dither); }
private void InitCirclesProgress(int[] colors) { InitColors(colors); _path = new Path(); Paint basePaint = new Paint(); basePaint.AntiAlias=true; _firstHalfPaint = new Paint(basePaint); _secondHalfPaint = new Paint(basePaint); _abovePaint = new Paint(basePaint); // init alpha and color filter SetAlpha(_alpha); SetColorFilter(_colorFilter); }
private void Initialize() { _path = new Path(); _bitmapPaint = new Paint(PaintFlags.Dither); _paint = new Paint { AntiAlias = true, Dither = true, Color = Color.Argb(255, 0, 0, 0) }; _paint.SetStyle(Paint.Style.Stroke); _paint.StrokeJoin = Paint.Join.Round; _paint.StrokeCap = Paint.Cap.Round; _paint.StrokeWidth = 8; SignatureData = new SignatureData(); }
/// <summary> /// Draw one child of this View Group. /// </summary> /// <param name="canvas">The canvas on which to draw the child</param> /// <param name="child">Who to draw</param> /// <param name="drawingTime">The time at which draw is occurring</param> /// <returns>To be added.</returns> /// <since version="Added in API level 1" /> /// <remarks><para tool="javadoc-to-mdoc">Draw one child of this View Group. This method is responsible for getting /// the canvas in the right state. This includes clipping, translating so /// that the child's scrolled origin is at 0, 0, and applying any animation /// transformations.</para> /// <para tool="javadoc-to-mdoc"> /// <format type="text/html"> /// <a href="http://developer.android.com/reference/android/view/ViewGroup.html#drawChild(android.graphics.Canvas, android.view.View, long)" target="_blank">[Android Documentation]</a> /// </format> /// </para></remarks> protected override bool DrawChild(Canvas canvas, global::Android.Views.View child, long drawingTime) { if (this.Element.Aspect != Aspect.AspectFit) { return base.DrawChild(canvas, child, drawingTime); } using (var path = new Path()) { path.AddCircle(Width / 2, Height / 2, (Math.Min(Width, Height) - 10) / 2, Path.Direction.Ccw); canvas.Save(); canvas.ClipPath(path); } return base.DrawChild(canvas, child, drawingTime); }
protected override bool DrawChild(Canvas canvas, global::Android.Views.View child, long drawingTime) { try { // Extract properties var source = (CircularImage)Element; var borderWidth = source.BorderWidth; var borderColor = source.BorderColor.ToAndroid(); var radius = Math.Min(Width, Height) / 2; var strokeWidth = 10; radius -= strokeWidth / 2; //Create path to clip var path = new Path(); path.AddCircle(Width / 2, Height / 2, radius, Path.Direction.Ccw); canvas.Save(); canvas.ClipPath(path); var result = base.DrawChild(canvas, child, drawingTime); canvas.Restore(); // Create path for circle border path = new Path(); path.AddCircle(Width / 2, Height / 2, radius, Path.Direction.Ccw); var paint = new Paint(); paint.AntiAlias = true; paint.StrokeWidth = borderWidth; paint.SetStyle(Paint.Style.Stroke); paint.Color = borderColor; canvas.DrawPath(path, paint); //Properly dispose paint.Dispose(); path.Dispose(); return result; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine("Unable to create circle image: " + ex); } return base.DrawChild(canvas, child, drawingTime); }
private void Setup () { path = new Path (); // Xamarin blue boxPaint = new Paint { Color = Color.ParseColor ("#3498db"), AntiAlias = true, StrokeWidth = 3 }; boxPaint.SetStyle (Paint.Style.Stroke); // Xamarin green pathPaint = new Paint { Color = Color.ParseColor ("#77d065"), AntiAlias = true, StrokeWidth = 3 }; pathPaint.SetStyle (Paint.Style.Stroke); }
public static void SetClipPath(this BorderRenderer br, Canvas canvas) { var clipPath = new Path(); //float padding = br;// radius / 2; float radius = (float)br.Element.CornerRadius - br.Context.ToPixels((float)br.Element.Padding.ThickestSide());// - padding / 2; // + MaxStrokeThickness()); int w = (int)br.Width; int h = (int)br.Height; clipPath.AddRoundRect(new RectF( br.ViewGroup.PaddingLeft, br.ViewGroup.PaddingTop, w - br.ViewGroup.PaddingRight, h - br.ViewGroup.PaddingBottom), radius, radius, Path.Direction.Cw); canvas.ClipPath(clipPath); }
public override void Draw(Android.Graphics.Canvas canvas) { try { int width = this.Width - this.PaddingLeft - this.PaddingRight; int height = this.Height - this.PaddingBottom - this.PaddingTop; var radius = Math.Min(width, height) / 2; //var strokeWidth = ((float)(5 * Math.Min(width, height))) / 100; //radius -= (int)Math.Round(strokeWidth / 2); // A revoir: Est-ce que c'est bien centré avec les padding? Path path = new Path(); path.AddCircle(this.PaddingLeft + (width / 2), this.PaddingTop + (height / 2), radius, Path.Direction.Ccw); canvas.Save(); canvas.ClipPath(path); base.Draw(canvas); canvas.Restore(); //path = new Path(); //path.AddCircle(this.PaddingLeft + (width / 2), this.PaddingTop + (height / 2), radius, Path.Direction.Ccw); //var paint = new Paint(); //paint.AntiAlias = true; //paint.StrokeWidth = strokeWidth; //paint.SetStyle(Paint.Style.Stroke); //paint.Color = Color.Black; //canvas.DrawPath(path, paint); //paint.Dispose(); path.Dispose(); return; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine("Unable to create circle image: " + ex); } base.Draw(canvas); }
public SignView(Context c, IAttributeSet attrs) : base(c, attrs) { _path = new Path(); _bitmapPaint = new Paint { Dither = true, Color = Color.Black }; _paint = new Paint { AntiAlias = true, Dither = true, Color = Color.Black }; _paint.SetStyle(Paint.Style.Stroke); _paint.StrokeJoin = Paint.Join.Round; _paint.StrokeCap = Paint.Cap.Round; _paint.StrokeWidth = 5f; }
protected override bool DrawChild(Canvas canvas, global::Android.Views.View child, long drawingTime) { try { var radius = Math.Min(Width, Height) / 2; var strokeWidth = 10; radius -= strokeWidth / 2; Path path = new Path(); path.AddCircle(Width / 2, Height / 2, radius, Path.Direction.Ccw); canvas.Save(); canvas.ClipPath(path); var result = base.DrawChild(canvas, child, drawingTime); canvas.Restore(); path = new Path(); path.AddCircle(Width / 2, Height / 2, radius, Path.Direction.Ccw); var paint = new Paint(); paint.AntiAlias = true; paint.StrokeWidth = 5; paint.SetStyle(Paint.Style.Stroke); paint.Color = global::Android.Graphics.Color.White; canvas.DrawPath(path, paint); paint.Dispose(); path.Dispose(); return result; } catch (Exception ex) { } return base.DrawChild(canvas, child, drawingTime); }
public static APath ToAPath(this Geometry geometry, Context context) { APath path = new APath(); float density = context.Resources.DisplayMetrics.Density; if (geometry is LineGeometry) { LineGeometry lineGeometry = geometry as LineGeometry; path.MoveTo( density * (float)lineGeometry.StartPoint.X, density * (float)lineGeometry.StartPoint.Y); path.LineTo( density * (float)lineGeometry.EndPoint.X, density * (float)lineGeometry.EndPoint.Y); } else if (geometry is RectangleGeometry) { Graphics.Rect rect = (geometry as RectangleGeometry).Rect; path.AddRect( density * (float)rect.Left, density * (float)rect.Top, density * (float)rect.Right, density * (float)rect.Bottom, APath.Direction.Cw); } else if (geometry is EllipseGeometry) { EllipseGeometry ellipseGeometry = geometry as EllipseGeometry; path.AddOval(new Graphics.RectF( density * (float)(ellipseGeometry.Center.X - ellipseGeometry.RadiusX), density * (float)(ellipseGeometry.Center.Y - ellipseGeometry.RadiusY), density * (float)(ellipseGeometry.Center.X + ellipseGeometry.RadiusX), density * (float)(ellipseGeometry.Center.Y + ellipseGeometry.RadiusY)), APath.Direction.Cw); } else if (geometry is GeometryGroup) { GeometryGroup geometryGroup = geometry as GeometryGroup; path.SetFillType(geometryGroup.FillRule == FillRule.Nonzero ? APath.FillType.Winding : APath.FillType.EvenOdd); foreach (Geometry child in geometryGroup.Children) { APath childPath = child.ToAPath(context); path.AddPath(childPath); } } else if (geometry is PathGeometry) { PathGeometry pathGeometry = geometry as PathGeometry; path.SetFillType(pathGeometry.FillRule == FillRule.Nonzero ? APath.FillType.Winding : APath.FillType.EvenOdd); foreach (PathFigure pathFigure in pathGeometry.Figures) { path.MoveTo( density * (float)pathFigure.StartPoint.X, density * (float)pathFigure.StartPoint.Y); Point lastPoint = pathFigure.StartPoint; foreach (PathSegment pathSegment in pathFigure.Segments) { // LineSegment if (pathSegment is LineSegment) { LineSegment lineSegment = pathSegment as LineSegment; path.LineTo( density * (float)lineSegment.Point.X, density * (float)lineSegment.Point.Y); lastPoint = lineSegment.Point; } // PolylineSegment else if (pathSegment is PolyLineSegment) { PolyLineSegment polylineSegment = pathSegment as PolyLineSegment; PointCollection points = polylineSegment.Points; for (int i = 0; i < points.Count; i++) { path.LineTo( density * (float)points[i].X, density * (float)points[i].Y); } lastPoint = points[points.Count - 1]; } // BezierSegment else if (pathSegment is BezierSegment) { BezierSegment bezierSegment = pathSegment as BezierSegment; path.CubicTo( density * (float)bezierSegment.Point1.X, density * (float)bezierSegment.Point1.Y, density * (float)bezierSegment.Point2.X, density * (float)bezierSegment.Point2.Y, density * (float)bezierSegment.Point3.X, density * (float)bezierSegment.Point3.Y); lastPoint = bezierSegment.Point3; } // PolyBezierSegment else if (pathSegment is PolyBezierSegment) { PolyBezierSegment polyBezierSegment = pathSegment as PolyBezierSegment; PointCollection points = polyBezierSegment.Points; if (points.Count >= 3) { for (int i = 0; i < points.Count; i += 3) { path.CubicTo( density * (float)points[i + 0].X, density * (float)points[i + 0].Y, density * (float)points[i + 1].X, density * (float)points[i + 1].Y, density * (float)points[i + 2].X, density * (float)points[i + 2].Y); } } lastPoint = points[points.Count - 1]; } // QuadraticBezierSegment else if (pathSegment is QuadraticBezierSegment) { QuadraticBezierSegment bezierSegment = pathSegment as QuadraticBezierSegment; path.QuadTo( density * (float)bezierSegment.Point1.X, density * (float)bezierSegment.Point1.Y, density * (float)bezierSegment.Point2.X, density * (float)bezierSegment.Point2.Y); lastPoint = bezierSegment.Point2; } // PolyQuadraticBezierSegment else if (pathSegment is PolyQuadraticBezierSegment) { PolyQuadraticBezierSegment polyBezierSegment = pathSegment as PolyQuadraticBezierSegment; PointCollection points = polyBezierSegment.Points; if (points.Count >= 2) { for (int i = 0; i < points.Count; i += 2) { path.QuadTo( density * (float)points[i + 0].X, density * (float)points[i + 0].Y, density * (float)points[i + 1].X, density * (float)points[i + 1].Y); } } lastPoint = points[points.Count - 1]; } // ArcSegment else if (pathSegment is ArcSegment) { ArcSegment arcSegment = pathSegment as ArcSegment; List <Point> points = new List <Point>(); GeometryHelper.FlattenArc( points, lastPoint, arcSegment.Point, arcSegment.Size.Width, arcSegment.Size.Height, arcSegment.RotationAngle, arcSegment.IsLargeArc, arcSegment.SweepDirection == SweepDirection.CounterClockwise, 1); for (int i = 0; i < points.Count; i++) { path.LineTo( density * (float)points[i].X, density * (float)points[i].Y); } if (points.Count > 0) { lastPoint = points[points.Count - 1]; } } } if (pathFigure.IsClosed) { path.Close(); } } } return(path); }
public void DrawPath(SolidColor color, Path graphicsPath) { // TODO }
public void FillPath(IColor color, Path graphicsPath) { // TODO }
public void ClearCanvas() { _path = new Path(); }
public void UpdateShape(APath path) { _path = path; UpdatePathShape(); }
public Path() { path = new Android.Graphics.Path(); }
protected void DrawFill(Android.Graphics.Canvas canvas, Windows.Foundation.Rect fillArea, Android.Graphics.Path fillPath) { if (!fillArea.HasZeroArea()) { var imageBrushFill = Fill as ImageBrush; if (imageBrushFill != null) { imageBrushFill.ScheduleRefreshIfNeeded(fillArea, Invalidate); imageBrushFill.DrawBackground(canvas, fillArea, fillPath); } else { var fill = Fill ?? SolidColorBrushHelper.Transparent; var fillPaint = fill.GetFillPaint(fillArea); canvas.DrawPath(fillPath, fillPaint); } } }
private void DrawStrokes() { if (canvas == null) { return; } //TODO check the replacement for canvas.Save canvas.Save(SaveFlags.Matrix); canvas.Translate(canvas.Width / 2f, canvas.Height / 2f); canvas.Rotate(deviceOrientation); canvas.Translate(-(canvas.Width / 2f), -(canvas.Height / 2f)); canvas.DrawColor(new Color((byte)(BackgroundColor.R * 255), (byte)(BackgroundColor.G * 255), (byte)(BackgroundColor.B * 255), (byte)(BackgroundColor.A * 255)), PorterDuff.Mode.Src); if (backgroundBitmap != null) { float scale = GetDrawingScale(); float offsetX = (Width - backgroundBitmap.Width * scale) / 2.0f; float offsetY = (Height - backgroundBitmap.Height * scale) / 2.0f; canvas.Translate(offsetX, offsetY); switch (backgroundScaling) { case Abstractions.Scaling.Absolute_None: case Abstractions.Scaling.Relative_None: canvas.DrawBitmap(backgroundBitmap, 0, 0, new Paint()); break; case Abstractions.Scaling.Absolute_Fit: case Abstractions.Scaling.Relative_Fit: canvas.DrawBitmap(backgroundBitmap, new Rect(0, 0, backgroundBitmap.Width, backgroundBitmap.Height), new Rect(0, 0, (int)(backgroundBitmap.Width * scale), (int)(backgroundBitmap.Height * scale)), new Paint()); break; case Abstractions.Scaling.Absolute_Fill: case Abstractions.Scaling.Relative_Fill: canvas.DrawBitmap(backgroundBitmap, new Rect(0, 0, backgroundBitmap.Width, backgroundBitmap.Height), new Rect(0, 0, (int)(Width * scale), (int)(Height * scale)), new Paint()); break; } } if (Strokes == null) { Strokes = new List <Abstractions.Stroke>(); } foreach (var stroke in Strokes) { double lastX = stroke.Points[0].X; double lastY = stroke.Points[0].Y; var paint = new Paint() { Color = new Color((byte)(stroke.StrokeColor.R * 255.0), (byte)(stroke.StrokeColor.G * 255.0), (byte)(stroke.StrokeColor.B * 255.0), (byte)(stroke.StrokeColor.A * 255.0)), StrokeWidth = (float)stroke.Thickness * metrics.Density, AntiAlias = true, StrokeCap = Paint.Cap.Round, }; paint.SetStyle(Paint.Style.Stroke); var path = new Android.Graphics.Path(); path.MoveTo((float)stroke.Points[0].X, (float)stroke.Points[0].Y); foreach (var p in stroke.Points) { path.LineTo((float)p.X, (float)p.Y); } canvas.DrawPath(path, paint); } canvas.Restore(); }