SHOW:
|
|
- or go back to the newest paste.
1 | In PCL: | |
2 | ||
3 | using Xamarin.Forms; | |
4 | ||
5 | namespace Project.UI.Controls | |
6 | { | |
7 | - | public class RoundedFrame:Frame |
7 | + | public class ExtendedFrame : Frame |
8 | { | |
9 | public RoundedFrame() | |
10 | { | |
11 | HasShadow = false; | |
12 | IsClippedToBounds = false; | |
13 | } | |
14 | ||
15 | - | public static readonly BindableProperty CornerRadiusProperty = BindableProperty.Create(nameof(CornerRadius), typeof(double), typeof(RoundedFrame), default(double)); |
15 | + | public static readonly BindableProperty CornerRadiusProperty = BindableProperty.Create(nameof(CornerRadius), typeof(double), typeof(ExtendedFrame), default(double)); |
16 | ||
17 | public double CornerRadius | |
18 | { | |
19 | get { return (double) GetValue(CornerRadiusProperty); } | |
20 | set { SetValue(CornerRadiusProperty, value);} | |
21 | } | |
22 | } | |
23 | } | |
24 | ||
25 | in Android: | |
26 | ||
27 | using Android.Graphics.Drawables; | |
28 | using Intouch.Controls; | |
29 | using Intouch.Droid.Renderers; | |
30 | using Xamarin.Forms; | |
31 | using Xamarin.Forms.Platform.Android; | |
32 | using Color = Android.Graphics.Color; | |
33 | ||
34 | [assembly: ExportRenderer(typeof(ExtendedFrame), typeof(ExtendedFrameRenderer))] | |
35 | namespace Project.Droid.Renderers | |
36 | { | |
37 | public class ExtendedFrameRenderer : FrameRenderer | |
38 | { | |
39 | protected override void OnElementChanged(ElementChangedEventArgs<Frame> e) | |
40 | { | |
41 | ||
42 | base.OnElementChanged(e); | |
43 | if (e.OldElement != null) return; | |
44 | var frame = (ExtendedFrame)e.NewElement; | |
45 | var vg = ViewGroup; | |
46 | #pragma warning disable 618 | |
47 | vg.SetBackgroundDrawable(GenerateShape(frame.BackgroundColor.ToAndroid(), frame.OutlineColor.ToAndroid(),1, frame.CornerRadius, frame.Width, frame.Height)); | |
48 | #pragma warning restore 618 | |
49 | } | |
50 | ||
51 | public static Drawable GenerateShape(Color color, Color colorStroke, int stokeSize, float strokeRadius, double width, double height) | |
52 | { | |
53 | ||
54 | var density = Forms.Context.Resources.DisplayMetrics.Density; | |
55 | stokeSize = (int) (stokeSize * density); | |
56 | strokeRadius = strokeRadius * density; | |
57 | ||
58 | var drawable = new GradientDrawable(GradientDrawable.Orientation.BottomTop, new int[] { color, color }); | |
59 | drawable.SetStroke(stokeSize, colorStroke); | |
60 | drawable.SetSize((int)(width*density), (int)(height*density)); | |
61 | drawable.SetCornerRadius(strokeRadius); | |
62 | ||
63 | return drawable; | |
64 | } | |
65 | } | |
66 | } | |
67 | ||
68 | ||
69 | ||
70 | in iOS: | |
71 | ||
72 | using System.ComponentModel; | |
73 | using Intouch.Controls; | |
74 | using Intouch.iOS.Renderers; | |
75 | using Xamarin.Forms; | |
76 | using Xamarin.Forms.Platform.iOS; | |
77 | ||
78 | [assembly: ExportRenderer(typeof(ExtendedFrame), typeof(ExtendedFrameRenderer))] | |
79 | namespace Project.iOS.Renderers | |
80 | { | |
81 | class ExtendedFrameRenderer : FrameRenderer | |
82 | { | |
83 | private ExtendedFrame extendedFrame; | |
84 | ||
85 | protected override void OnElementChanged(ElementChangedEventArgs<Frame> e) | |
86 | { | |
87 | base.OnElementChanged(e); | |
88 | ||
89 | extendedFrame = (e.NewElement as ExtendedFrame); | |
90 | SetCornerRadius(); | |
91 | ||
92 | } | |
93 | ||
94 | protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) | |
95 | { | |
96 | base.OnElementPropertyChanged(sender, e); | |
97 | ||
98 | if (e.PropertyName == "CornerRadius") | |
99 | { | |
100 | SetCornerRadius(); | |
101 | } | |
102 | } | |
103 | ||
104 | private void SetCornerRadius() | |
105 | { | |
106 | if (this.NativeView != null && extendedFrame != null) | |
107 | { | |
108 | this.NativeView.Layer.CornerRadius = extendedFrame.CornerRadius; | |
109 | } | |
110 | } | |
111 | } | |
112 | } |