/* * public static void DrawGradientPath(Canvas canvas, List<TinyTypeLib.PointF> path, int gradientSize, Color color) * { * if (path.Count < 3) * { * throw new Exception("Path must have at least three points"); * } * * // Add the first two points to the end to make it easier to assess direction * int originalCount = path.Count; * path.Add(path[0]); * path.Add(path[1]); * * for (int i = 0; i < originalCount; i++ ) * { * Line line = new Line(path[i], path[i + 1]); * DrawGradientLine(canvas, line, gradientSize, color); * } * } * * public static void DrawGradientCap(Canvas canvas, TinyTypeLib.Rect middleSquare, int quadrant, int gradientSize, Color color) * { * Paint paint = new Paint(); * paint.SetStyle(Paint.Style.Fill); * Color transparent = color; * transparent.A = 0; * * Point center = new Point( * quadrant == 1 || quadrant == 4 ? middleSquare.Right : middleSquare.Left, * quadrant == 1 || quadrant == 2 ? middleSquare.Top : middleSquare.Bottom); * * int startAngle = (4 - quadrant) * 90; * * paint.SetShader(new RadialGradient(center.X, center.Y, gradientSize, color, transparent, Shader.TileMode.Mirror)); * canvas.DrawArc(new RectF( * center.X - gradientSize, * center.Y - gradientSize, * center.X + gradientSize, * center.Y + gradientSize), startAngle, 90, true, paint); * * } */ // gradientSize is the distance from the line to half-way through the gradient's fade // The direction of the gradient is controlled by the sign of signedGradientSize public static void DrawGradientLine(Canvas canvas, Line line, int signedGradientSize, Color color, TinyTypeLib.Rect clipRect) { // Allow for a little overlap. For some reason, Android leaves a white line even though the clipRects were lining up. clipRect = new TinyTypeLib.Rect(clipRect.Left - 1, clipRect.Top - 1, clipRect.Right + 1, clipRect.Bottom + 1); int gradientSizeAbs = Math.Abs(signedGradientSize); Line perpendicular = line.GetPerpendicular(gradientSizeAbs); Paint paint = new Paint(); paint.SetStyle(Paint.Style.Stroke); paint.StrokeCap = Paint.Cap.Butt; // Here we need to solve for the gradient's start point, or the location of B. We'll solve for angle C and length a to find that out. double c = line.Length; double b = gradientSizeAbs; /* * B____c_____A * \ / * a\ /b * \/ * C=90 */ // Solve for angle B in radians. B = sin-1(b/c) double B = Math.Asin(b / c); // Solve for length a. a^2+b^2 = c^2, so a = sqrt(c^2-b^2) double a = Math.Sqrt((c * c) - (b * b)); int direction = signedGradientSize > 0 ? -1 : 1; double finalAngle = direction * B + line.Angle; Line test = new Line(866, 313.5f, 678, 313.5f); double ang = test.Angle; // should be 3.14 Line l = new Line(line.Start, finalAngle, a); Line gradientLine = new Line(l.End, line.End); canvas.ClipRect(AndroidUtil.GetRect(clipRect)); paint.StrokeWidth = gradientSizeAbs * 2; paint.SetShader(new LinearGradient(gradientLine.Start.X, gradientLine.Start.Y, gradientLine.End.X, gradientLine.End.Y, color, AndroidUtil.GetTransparentColor(color), Shader.TileMode.Mirror)); canvas.DrawLine(l.Start.X, l.Start.Y, l.End.X, l.End.Y, paint); }