public static void SetBorder(this AView view, Context context, VisualElement element, Color color, double width) { var borderWidth = (int)context.ToPixels(width); switch (view.Background) { case GradientDrawable gradientDrawable: gradientDrawable.SetStroke(borderWidth, ColorStateList.ValueOf(color.ToAndroid())); break; case GradientStrokeDrawable gradientStrokeDrawable: gradientStrokeDrawable.SetStroke(borderWidth, color); break; case PaintDrawable paintDrawable: var paint = paintDrawable.Paint; paint.AntiAlias = true; paint.Color = color.ToAndroid(); paint.StrokeWidth = borderWidth; paint.SetStyle(Paint.Style.Stroke); if (element is IGradientElement gradientElement) { view.SetPaintGradient(gradientElement.Gradients, gradientElement.Angle); } break; default: view.Background?.Dispose(); var newGradientDrawable = new GradientDrawable(); newGradientDrawable.SetStroke(borderWidth, ColorStateList.ValueOf(color.ToAndroid())); newGradientDrawable.SetColor(element.BackgroundColor.ToAndroid()); view.Background = newGradientDrawable; break; } }
public static void SetGradient(this AView view, XGradientType type, IList <GradientStop> gradients, float angle) { if (!gradients.Any()) { return; } var colors = gradients.Select(x => (int)x.Color.ToAndroid()).ToArray(); var positions = gradients.Select(x => x.Offset).ToArray(); /* If positions are set, then go for PaintDrawable */ if (!positions.All(x => Math.Abs(x) < Math.Pow(10, -10))) { view.SetPaintGradient(gradients, angle); return; } var constructNew = true; GradientDrawable gradientDrawable; /* Reuse existing one */ if (view.Background is GradientDrawable oldGradientDrawable) { constructNew = false; gradientDrawable = oldGradientDrawable; } else { gradientDrawable = new GradientDrawable(); } gradientDrawable.SetColors(colors); gradientDrawable.SetOrientation(angle); switch (type) { case XGradientType.Radial: gradientDrawable.SetGradientType(AGradientType.RadialGradient); gradientDrawable.SetGradientRadius(view.Context.Resources.DisplayMetrics.WidthPixels); break; default: gradientDrawable.SetShape(ShapeType.Rectangle); gradientDrawable.SetGradientType(AGradientType.LinearGradient); break; } if (!constructNew) { return; } view.Background?.Dispose(); view.Background = gradientDrawable; }