Pixiview/Pixiview.Android/Renderers/CardViewRenderer.cs
2020-05-11 23:18:38 +08:00

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);
}
}
}
}