feature: Android renderers

This commit is contained in:
2020-05-14 11:13:23 +08:00
parent a4caf325b0
commit f6dbec2fda
14 changed files with 557 additions and 43 deletions

View File

@ -1,6 +1,5 @@
using Android.Content;
using Android.Graphics;
using Android.Views;
using Pixiview.Droid.Renderers;
using Pixiview.UI;
using Xamarin.Forms;
@ -11,8 +10,6 @@ namespace Pixiview.Droid.Renderers
{
public class CardViewRenderer : VisualElementRenderer<CardView>
{
ViewOutlineProvider original;
public CardViewRenderer(Context context) : base(context)
{
}
@ -27,39 +24,19 @@ namespace Pixiview.Droid.Renderers
var radius = element.CornerRadius;
if (radius > 0)
{
original = OutlineProvider;
OutlineProvider = new CornerRadiusOutlineProvider(element, radius);
ClipToOutline = true;
//var scale = Resources.DisplayMetrics.Density;
//OutlineProvider = new CornerRadiusOutlineProvider(element, radius, scale);
//ClipToOutline = true;
var density = Resources.DisplayMetrics.Density;
Elevation = (float)(element.ShadowOffset.Height + 2) * density;
var drawable = new RoundCornerDrawable(radius * density);
drawable.SetColorFilter(element.BackgroundColor.ToAndroid(), PorterDuff.Mode.Src);
((Android.Views.View)this).SetBackground(drawable);
}
}
}
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);
}
}
}
}