private static void makeEffects(PathEffect[] e, float phase) { e [0] = null; // no effect e [1] = new CornerPathEffect(10); e [2] = new DashPathEffect(new float[] { 10, 5, 5, 5 }, phase); e [3] = new PathDashPathEffect(makePathDash(), 12, phase, PathDashPathEffect.Style.ROTATE); e [4] = new ComposePathEffect(e [2], e [1]); e [5] = new ComposePathEffect(e [3], e [1]); }
protected override void OnDraw(Canvas canvas) { base.OnDraw(canvas); var x = this.GetX() + this.Resize(this._shapeView.Padding.Left); var y = this.GetY() + this.Resize(this._shapeView.Padding.Top); var width = base.Width - this.Resize(this._shapeView.Padding.HorizontalThickness); var height = base.Height - this.Resize(this._shapeView.Padding.VerticalThickness); var cx = width / 2f + this.Resize(this._shapeView.Padding.Left); var cy = height / 2f + this.Resize(this._shapeView.Padding.Top); var strokeWidth = 0f; Paint strokePaint = null; if (this._shapeView.BorderWidth > 0 && this._shapeView.BorderColor.A > 0) { strokeWidth = this.Resize(this._shapeView.BorderWidth); strokePaint = new Paint(PaintFlags.AntiAlias); strokePaint.SetStyle(Paint.Style.Stroke); strokePaint.StrokeWidth = strokeWidth; strokePaint.StrokeCap = Paint.Cap.Round; strokePaint.Color = this._shapeView.BorderColor.ToAndroid(); x += strokeWidth / 2f; y += strokeWidth / 2f; width -= strokeWidth; height -= strokeWidth; } Paint fillPaint = null; if (this._shapeView.Color.A > 0) { fillPaint = new Paint(PaintFlags.AntiAlias); fillPaint.SetStyle(Paint.Style.Fill); fillPaint.Color = this._shapeView.Color.ToAndroid(); } if (this._shapeView.CornerRadius > 0) { switch (this._shapeView.ShapeType) { case ShapeType.Star: case ShapeType.Triangle: case ShapeType.Diamond: case ShapeType.Path: var cr = this.Resize(this._shapeView.CornerRadius); var cornerPathEffect = new CornerPathEffect(cr); fillPaint?.SetPathEffect(cornerPathEffect); strokePaint?.SetPathEffect(cornerPathEffect); break; } } switch (this._shapeView.ShapeType) { case ShapeType.Box: this.DrawBox(canvas, x, y, width, height, this._shapeView.CornerRadius, fillPaint, strokePaint); break; case ShapeType.Circle: this.DrawCircle(canvas, cx, cy, Math.Min(height, width) / 2f, fillPaint, strokePaint); break; case ShapeType.Oval: this.DrawOval(canvas, x, y, width, height, fillPaint, strokePaint); break; case ShapeType.Star: var outerRadius = (Math.Min(height, width) - strokeWidth) / 2f; var innerRadius = outerRadius * this._shapeView.RadiusRatio; this.DrawStar(canvas, cx, cy, outerRadius, innerRadius, this._shapeView.CornerRadius, this._shapeView.NumberOfPoints, fillPaint, strokePaint); break; case ShapeType.Triangle: this.DrawTriangle(canvas, x + strokeWidth / 2, y + strokeWidth / 2, width - strokeWidth, height - strokeWidth, fillPaint, strokePaint); break; case ShapeType.Diamond: this.DrawDiamond(canvas, x + strokeWidth / 2, y + strokeWidth / 2, width - strokeWidth, height - strokeWidth, fillPaint, strokePaint); break; case ShapeType.Heart: this.DrawHeart(canvas, x, y, width, height, this.Resize(this._shapeView.CornerRadius), fillPaint, strokePaint); break; case ShapeType.ProgressCircle: this.DrawCircle(canvas, cx, cy, Math.Min(height, width) / 2f, fillPaint, strokePaint); if (this._shapeView.ProgressBorderWidth > 0 && this._shapeView.ProgressBorderColor.A > 0) { var progressStrokeWidth = this.Resize(this._shapeView.ProgressBorderWidth); var progressPaint = new Paint(PaintFlags.AntiAlias); progressPaint.SetStyle(Paint.Style.Stroke); progressPaint.StrokeWidth = progressStrokeWidth; progressPaint.Color = this._shapeView.ProgressBorderColor.ToAndroid(); var deltaWidth = progressStrokeWidth - strokeWidth; if (deltaWidth > 0) { width -= deltaWidth; height -= deltaWidth; } this.DrawProgressCircle(canvas, cx, cy, Math.Min(height, width) / 2f, this._shapeView.Progress, progressPaint); } break; case ShapeType.Path: this.DrawPath(canvas, this._shapeView.Points, x, y, fillPaint, strokePaint); break; } }