using Android.Content; using Android.Graphics; using Android.Views; using Pixiview.Droid.Renderers; using Pixiview.UI; using Xamarin.Forms; using Xamarin.Forms.Platform.Android; [assembly: ExportRenderer(typeof(CardView), typeof(CardViewRenderer))] namespace Pixiview.Droid.Renderers { public class CardViewRenderer : VisualElementRenderer { ViewOutlineProvider original; public CardViewRenderer(Context context) : base(context) { } protected override void OnElementChanged(ElementChangedEventArgs e) { base.OnElementChanged(e); var element = e.NewElement; if (element != null) { var radius = element.CornerRadius; if (radius > 0) { original = OutlineProvider; OutlineProvider = new CornerRadiusOutlineProvider(element, radius); ClipToOutline = true; } } } protected override void OnDetachedFromWindow() { OutlineProvider = original; base.OnDetachedFromWindow(); } private class CornerRadiusOutlineProvider : ViewOutlineProvider { private readonly Element element; private readonly float radius; public CornerRadiusOutlineProvider(Element from, float r) { element = from; radius = r; } public override void GetOutline(Android.Views.View view, Outline outline) { var scale = view.Resources.DisplayMetrics.Density; var width = (double)element.GetValue(VisualElement.WidthProperty) * scale; var height = (double)element.GetValue(VisualElement.HeightProperty) * scale; var rect = new Rect(0, 0, (int)width, (int)height); outline.SetRoundRect(rect, radius * scale); } } } }