66 lines
2.0 KiB
C#
66 lines
2.0 KiB
C#
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<CardView>
|
|
{
|
|
ViewOutlineProvider original;
|
|
|
|
public CardViewRenderer(Context context) : base(context)
|
|
{
|
|
}
|
|
|
|
protected override void OnElementChanged(ElementChangedEventArgs<CardView> 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);
|
|
}
|
|
}
|
|
}
|
|
}
|