зеркало из https://github.com/DeGsoft/maui-linux.git
Added CornerRadius property To Frame control
This commit is contained in:
Родитель
0cc2fd2b67
Коммит
4554e822e3
|
@ -11,6 +11,8 @@ namespace Xamarin.Forms
|
||||||
|
|
||||||
public static readonly BindableProperty HasShadowProperty = BindableProperty.Create("HasShadow", typeof(bool), typeof(Frame), true);
|
public static readonly BindableProperty HasShadowProperty = BindableProperty.Create("HasShadow", typeof(bool), typeof(Frame), true);
|
||||||
|
|
||||||
|
public static readonly BindableProperty CornerRadiusProperty = BindableProperty.Create(nameof(CornerRadius), typeof(float), typeof(Frame), -1.0f);
|
||||||
|
|
||||||
readonly Lazy<PlatformConfigurationRegistry<Frame>> _platformConfigurationRegistry;
|
readonly Lazy<PlatformConfigurationRegistry<Frame>> _platformConfigurationRegistry;
|
||||||
|
|
||||||
public Frame()
|
public Frame()
|
||||||
|
@ -31,6 +33,12 @@ namespace Xamarin.Forms
|
||||||
set { SetValue(OutlineColorProperty, value); }
|
set { SetValue(OutlineColorProperty, value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public float CornerRadius
|
||||||
|
{
|
||||||
|
get { return (float)GetValue(CornerRadiusProperty); }
|
||||||
|
set { SetValue(CornerRadiusProperty, value); }
|
||||||
|
}
|
||||||
|
|
||||||
public IPlatformElementConfiguration<T, Frame> On<T>() where T : IConfigPlatform
|
public IPlatformElementConfiguration<T, Frame> On<T>() where T : IConfigPlatform
|
||||||
{
|
{
|
||||||
return _platformConfigurationRegistry.Value.On<T>();
|
return _platformConfigurationRegistry.Value.On<T>();
|
||||||
|
|
|
@ -20,6 +20,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
|
||||||
readonly TapGestureHandler _tapGestureHandler;
|
readonly TapGestureHandler _tapGestureHandler;
|
||||||
|
|
||||||
float _defaultElevation = -1f;
|
float _defaultElevation = -1f;
|
||||||
|
float _defaultCornerRadius = -1f;
|
||||||
|
|
||||||
bool _clickable;
|
bool _clickable;
|
||||||
bool _disposed;
|
bool _disposed;
|
||||||
|
@ -184,6 +185,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
|
||||||
e.NewElement.PropertyChanged += OnElementPropertyChanged;
|
e.NewElement.PropertyChanged += OnElementPropertyChanged;
|
||||||
UpdateShadow();
|
UpdateShadow();
|
||||||
UpdateBackgroundColor();
|
UpdateBackgroundColor();
|
||||||
|
UpdateCornerRadius();
|
||||||
SubscribeGestureRecognizers(e.NewElement);
|
SubscribeGestureRecognizers(e.NewElement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -215,6 +217,8 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
|
||||||
UpdateShadow();
|
UpdateShadow();
|
||||||
else if (e.PropertyName == VisualElement.BackgroundColorProperty.PropertyName)
|
else if (e.PropertyName == VisualElement.BackgroundColorProperty.PropertyName)
|
||||||
UpdateBackgroundColor();
|
UpdateBackgroundColor();
|
||||||
|
else if (e.PropertyName == Frame.CornerRadiusProperty.PropertyName)
|
||||||
|
UpdateCornerRadius();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SubscribeGestureRecognizers(VisualElement element)
|
void SubscribeGestureRecognizers(VisualElement element)
|
||||||
|
@ -286,5 +290,22 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
|
||||||
else
|
else
|
||||||
CardElevation = 0f;
|
CardElevation = 0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UpdateCornerRadius()
|
||||||
|
{
|
||||||
|
if (_defaultCornerRadius == -1f)
|
||||||
|
{
|
||||||
|
_defaultCornerRadius = Radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
float cornerRadius = Element.CornerRadius;
|
||||||
|
|
||||||
|
if (cornerRadius == -1f)
|
||||||
|
cornerRadius = _defaultCornerRadius;
|
||||||
|
else
|
||||||
|
cornerRadius = Context.ToPixels(cornerRadius);
|
||||||
|
|
||||||
|
Radius = cornerRadius;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -27,7 +27,10 @@ namespace Xamarin.Forms.Platform.Android
|
||||||
base.OnElementChanged(e);
|
base.OnElementChanged(e);
|
||||||
|
|
||||||
if (e.NewElement != null && e.OldElement == null)
|
if (e.NewElement != null && e.OldElement == null)
|
||||||
|
{
|
||||||
UpdateBackground();
|
UpdateBackground();
|
||||||
|
UpdateCornerRadius();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateBackground()
|
void UpdateBackground()
|
||||||
|
@ -35,6 +38,11 @@ namespace Xamarin.Forms.Platform.Android
|
||||||
this.SetBackground(new FrameDrawable(Element));
|
this.SetBackground(new FrameDrawable(Element));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UpdateCornerRadius()
|
||||||
|
{
|
||||||
|
this.SetBackground(new FrameDrawable(Element));
|
||||||
|
}
|
||||||
|
|
||||||
class FrameDrawable : Drawable
|
class FrameDrawable : Drawable
|
||||||
{
|
{
|
||||||
readonly Frame _frame;
|
readonly Frame _frame;
|
||||||
|
@ -127,14 +135,13 @@ namespace Xamarin.Forms.Platform.Android
|
||||||
|
|
||||||
using (var canvas = new ACanvas(bitmap))
|
using (var canvas = new ACanvas(bitmap))
|
||||||
{
|
{
|
||||||
DrawBackground(canvas, width, height, pressed);
|
DrawCanvas(canvas, width, height, pressed);
|
||||||
DrawOutline(canvas, width, height);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return bitmap;
|
return bitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawBackground(ACanvas canvas, int width, int height, bool pressed)
|
void DrawBackground(ACanvas canvas, int width, int height, float cornerRadius, bool pressed)
|
||||||
{
|
{
|
||||||
using (var paint = new Paint { AntiAlias = true })
|
using (var paint = new Paint { AntiAlias = true })
|
||||||
using (var path = new Path())
|
using (var path = new Path())
|
||||||
|
@ -142,8 +149,8 @@ namespace Xamarin.Forms.Platform.Android
|
||||||
using (Paint.Style style = Paint.Style.Fill)
|
using (Paint.Style style = Paint.Style.Fill)
|
||||||
using (var rect = new RectF(0, 0, width, height))
|
using (var rect = new RectF(0, 0, width, height))
|
||||||
{
|
{
|
||||||
float rx = Forms.Context.ToPixels(5);
|
float rx = Forms.Context.ToPixels(cornerRadius);
|
||||||
float ry = Forms.Context.ToPixels(5);
|
float ry = Forms.Context.ToPixels(cornerRadius);
|
||||||
path.AddRoundRect(rect, rx, ry, direction);
|
path.AddRoundRect(rect, rx, ry, direction);
|
||||||
|
|
||||||
global::Android.Graphics.Color color = _frame.BackgroundColor.ToAndroid();
|
global::Android.Graphics.Color color = _frame.BackgroundColor.ToAndroid();
|
||||||
|
@ -155,7 +162,7 @@ namespace Xamarin.Forms.Platform.Android
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawOutline(ACanvas canvas, int width, int height)
|
void DrawOutline(ACanvas canvas, int width, int height, float cornerRadius)
|
||||||
{
|
{
|
||||||
using (var paint = new Paint { AntiAlias = true })
|
using (var paint = new Paint { AntiAlias = true })
|
||||||
using (var path = new Path())
|
using (var path = new Path())
|
||||||
|
@ -163,8 +170,8 @@ namespace Xamarin.Forms.Platform.Android
|
||||||
using (Paint.Style style = Paint.Style.Stroke)
|
using (Paint.Style style = Paint.Style.Stroke)
|
||||||
using (var rect = new RectF(0, 0, width, height))
|
using (var rect = new RectF(0, 0, width, height))
|
||||||
{
|
{
|
||||||
float rx = Forms.Context.ToPixels(5);
|
float rx = Forms.Context.ToPixels(cornerRadius);
|
||||||
float ry = Forms.Context.ToPixels(5);
|
float ry = Forms.Context.ToPixels(cornerRadius);
|
||||||
path.AddRoundRect(rect, rx, ry, direction);
|
path.AddRoundRect(rect, rx, ry, direction);
|
||||||
|
|
||||||
paint.StrokeWidth = 1;
|
paint.StrokeWidth = 1;
|
||||||
|
@ -177,19 +184,33 @@ namespace Xamarin.Forms.Platform.Android
|
||||||
|
|
||||||
void FrameOnPropertyChanged(object sender, PropertyChangedEventArgs e)
|
void FrameOnPropertyChanged(object sender, PropertyChangedEventArgs e)
|
||||||
{
|
{
|
||||||
if (e.PropertyName == VisualElement.BackgroundColorProperty.PropertyName || e.PropertyName == Frame.OutlineColorProperty.PropertyName)
|
if (e.PropertyName == VisualElement.BackgroundColorProperty.PropertyName ||
|
||||||
|
e.PropertyName == Frame.OutlineColorProperty.PropertyName ||
|
||||||
|
e.PropertyName == Frame.CornerRadiusProperty.PropertyName)
|
||||||
{
|
{
|
||||||
using (var canvas = new ACanvas(_normalBitmap))
|
using (var canvas = new ACanvas(_normalBitmap))
|
||||||
{
|
{
|
||||||
int width = Bounds.Width();
|
int width = Bounds.Width();
|
||||||
int height = Bounds.Height();
|
int height = Bounds.Height();
|
||||||
canvas.DrawColor(global::Android.Graphics.Color.Black, PorterDuff.Mode.Clear);
|
canvas.DrawColor(global::Android.Graphics.Color.Black, PorterDuff.Mode.Clear);
|
||||||
DrawBackground(canvas, width, height, false);
|
DrawCanvas(canvas, width, height, false);
|
||||||
DrawOutline(canvas, width, height);
|
|
||||||
}
|
}
|
||||||
InvalidateSelf();
|
InvalidateSelf();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DrawCanvas(ACanvas canvas, int width, int height, bool pressed)
|
||||||
|
{
|
||||||
|
float cornerRadius = _frame.CornerRadius;
|
||||||
|
|
||||||
|
if (cornerRadius == -1f)
|
||||||
|
cornerRadius = 5f; // default corner radius
|
||||||
|
else
|
||||||
|
cornerRadius = Forms.Context.ToPixels(cornerRadius);
|
||||||
|
|
||||||
|
DrawBackground(canvas, width, height, cornerRadius, pressed);
|
||||||
|
DrawOutline(canvas, width, height, cornerRadius);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -19,6 +19,7 @@ namespace Xamarin.Forms.Platform.WinPhone
|
||||||
|
|
||||||
PackChild();
|
PackChild();
|
||||||
UpdateBorder();
|
UpdateBorder();
|
||||||
|
UpdateCornerRadius();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
|
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
|
||||||
|
@ -29,6 +30,8 @@ namespace Xamarin.Forms.Platform.WinPhone
|
||||||
PackChild();
|
PackChild();
|
||||||
else if (e.PropertyName == Frame.OutlineColorProperty.PropertyName || e.PropertyName == Frame.HasShadowProperty.PropertyName)
|
else if (e.PropertyName == Frame.OutlineColorProperty.PropertyName || e.PropertyName == Frame.HasShadowProperty.PropertyName)
|
||||||
UpdateBorder();
|
UpdateBorder();
|
||||||
|
else if (e.PropertyName == Frame.CornerRadiusProperty.PropertyName)
|
||||||
|
UpdateCornerRadius();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PackChild()
|
void PackChild()
|
||||||
|
@ -44,7 +47,6 @@ namespace Xamarin.Forms.Platform.WinPhone
|
||||||
|
|
||||||
void UpdateBorder()
|
void UpdateBorder()
|
||||||
{
|
{
|
||||||
Control.CornerRadius = new CornerRadius(5);
|
|
||||||
if (Element.OutlineColor != Color.Default)
|
if (Element.OutlineColor != Color.Default)
|
||||||
{
|
{
|
||||||
Control.BorderBrush = Element.OutlineColor.ToBrush();
|
Control.BorderBrush = Element.OutlineColor.ToBrush();
|
||||||
|
@ -53,5 +55,15 @@ namespace Xamarin.Forms.Platform.WinPhone
|
||||||
else
|
else
|
||||||
Control.BorderBrush = new Color(0, 0, 0, 0).ToBrush();
|
Control.BorderBrush = new Color(0, 0, 0, 0).ToBrush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UpdateCornerRadius()
|
||||||
|
{
|
||||||
|
float cornerRadius = Element.CornerRadius;
|
||||||
|
|
||||||
|
if (cornerRadius == -1f)
|
||||||
|
cornerRadius = 5f; // default corner radius
|
||||||
|
|
||||||
|
Control.CornerRadius = new CornerRadius(cornerRadius);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -28,6 +28,7 @@ namespace Xamarin.Forms.Platform.WinRT
|
||||||
|
|
||||||
PackChild();
|
PackChild();
|
||||||
UpdateBorder();
|
UpdateBorder();
|
||||||
|
UpdateCornerRadius();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,6 +44,10 @@ namespace Xamarin.Forms.Platform.WinRT
|
||||||
{
|
{
|
||||||
UpdateBorder();
|
UpdateBorder();
|
||||||
}
|
}
|
||||||
|
else if (e.PropertyName == Frame.CornerRadiusProperty.PropertyName)
|
||||||
|
{
|
||||||
|
UpdateCornerRadius();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PackChild()
|
void PackChild()
|
||||||
|
@ -56,7 +61,6 @@ namespace Xamarin.Forms.Platform.WinRT
|
||||||
|
|
||||||
void UpdateBorder()
|
void UpdateBorder()
|
||||||
{
|
{
|
||||||
Control.CornerRadius = new CornerRadius(5);
|
|
||||||
if (Element.OutlineColor != Color.Default)
|
if (Element.OutlineColor != Color.Default)
|
||||||
{
|
{
|
||||||
Control.BorderBrush = Element.OutlineColor.ToBrush();
|
Control.BorderBrush = Element.OutlineColor.ToBrush();
|
||||||
|
@ -67,5 +71,15 @@ namespace Xamarin.Forms.Platform.WinRT
|
||||||
Control.BorderBrush = new Color(0, 0, 0, 0).ToBrush();
|
Control.BorderBrush = new Color(0, 0, 0, 0).ToBrush();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UpdateCornerRadius()
|
||||||
|
{
|
||||||
|
float cornerRadius = Element.CornerRadius;
|
||||||
|
|
||||||
|
if (cornerRadius == -1f)
|
||||||
|
cornerRadius = 5f; // default corner radius
|
||||||
|
|
||||||
|
Control.CornerRadius = new CornerRadius(cornerRadius);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -25,7 +25,13 @@ namespace Xamarin.Forms.Platform.iOS
|
||||||
|
|
||||||
void SetupLayer()
|
void SetupLayer()
|
||||||
{
|
{
|
||||||
Layer.CornerRadius = 5;
|
float cornerRadius = Element.CornerRadius;
|
||||||
|
|
||||||
|
if (cornerRadius == -1f)
|
||||||
|
cornerRadius = 5f; // default corner radius
|
||||||
|
|
||||||
|
Layer.CornerRadius = cornerRadius;
|
||||||
|
|
||||||
if (Element.BackgroundColor == Color.Default)
|
if (Element.BackgroundColor == Color.Default)
|
||||||
Layer.BackgroundColor = UIColor.White.CGColor;
|
Layer.BackgroundColor = UIColor.White.CGColor;
|
||||||
else
|
else
|
||||||
|
|
Загрузка…
Ссылка в новой задаче