diff --git a/Pixiview.Android/Properties/AndroidManifest.xml b/Pixiview.Android/Properties/AndroidManifest.xml index 3def139..495833e 100644 --- a/Pixiview.Android/Properties/AndroidManifest.xml +++ b/Pixiview.Android/Properties/AndroidManifest.xml @@ -1,6 +1,6 @@  - + \ No newline at end of file diff --git a/Pixiview.Android/Renderers/CardViewRenderer.cs b/Pixiview.Android/Renderers/CardViewRenderer.cs index d930cc4..ff2b603 100644 --- a/Pixiview.Android/Renderers/CardViewRenderer.cs +++ b/Pixiview.Android/Renderers/CardViewRenderer.cs @@ -1,5 +1,7 @@ -using Android.Content; +using System.ComponentModel; +using Android.Content; using Android.Graphics; +using Android.Views; using Pixiview.Droid.Renderers; using Pixiview.UI; using Xamarin.Forms; @@ -24,19 +26,59 @@ namespace Pixiview.Droid.Renderers var radius = element.CornerRadius; if (radius > 0) { - //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; + OutlineProvider = new CornerRadiusOutlineProvider(element, radius, density); + ClipToOutline = true; - var drawable = new RoundCornerDrawable(radius * density); - drawable.SetColorFilter(element.BackgroundColor.ToAndroid(), PorterDuff.Mode.Src); - ((Android.Views.View)this).SetBackground(drawable); + //var drawable = new RoundCornerDrawable(radius * density); + //drawable.SetColorFilter(element.BackgroundColor.ToAndroid(), PorterDuff.Mode.Src); + //((Android.Views.View)this).SetBackground(drawable); + + Elevation = (float)(element.ShadowOffset.Height + 2) * density; } } } + + protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) + { + base.OnElementPropertyChanged(sender, e); + + var element = Element; + if (element == null) + { + return; + } + switch (e.PropertyName) + { + case nameof(CardView.ShadowOffset): + var density = Resources.DisplayMetrics.Density; + Elevation = (float)(element.ShadowOffset.Height + 2) * density; + break; + } + } + + class CornerRadiusOutlineProvider : ViewOutlineProvider + { + readonly Element element; + readonly float radius; + readonly float density; + + public CornerRadiusOutlineProvider(Element formsElement, float radius, float density) + { + element = formsElement; + this.radius = radius * density; + this.density = density; + } + + public override void GetOutline(Android.Views.View view, Outline outline) + { + float scale = density; + double width = (double)element.GetValue(VisualElement.WidthProperty) * scale; + double height = (double)element.GetValue(VisualElement.HeightProperty) * scale; + Rect rect = new Rect(0, 0, (int)width, (int)height); + outline.SetRoundRect(rect, radius); + } + } } }