diff --git a/src/GraphicsControls/Handlers/Button/MaterialButtonDrawable.cs b/src/GraphicsControls/Handlers/Button/MaterialButtonDrawable.cs index d131e48..354bd68 100644 --- a/src/GraphicsControls/Handlers/Button/MaterialButtonDrawable.cs +++ b/src/GraphicsControls/Handlers/Button/MaterialButtonDrawable.cs @@ -58,7 +58,8 @@ public void DrawText(ICanvas canvas, RectF dirtyRect, IButton button) var width = dirtyRect.Width; var text = (button as IText)?.Text; - canvas.DrawString(text?.ToUpper(), x, y, width, MaterialBackgroundHeight, HorizontalAlignment.Center, VerticalAlignment.Center); + canvas.DrawString(text?.ToUpper(), x, y, width, MaterialBackgroundHeight, HorizontalAlignment.Center, + VerticalAlignment.Center); canvas.RestoreState(); } @@ -74,12 +75,12 @@ internal void DrawRippleEffect(ICanvas canvas, RectF dirtyRect, IButton button) canvas.ClipPath(border); - canvas.FillColor = Material.Color.White.ToColor().WithAlpha(0.75f); + var color = button.Background?.ToColor() ?? Colors.White; + canvas.FillColor = color?.ComplementaryColor().WithAlpha(0.5f); canvas.Alpha = 0.25f; - float minimumRippleEffectSize = 0.0f; - + const float minimumRippleEffectSize = 0.0f; var rippleEffectSize = minimumRippleEffectSize.Lerp(dirtyRect.Width, AnimationPercent); canvas.FillCircle((float)TouchPoint.X, (float)TouchPoint.Y, rippleEffectSize); diff --git a/src/GraphicsControls/Handlers/CheckBox/CheckBoxHandler.cs b/src/GraphicsControls/Handlers/CheckBox/CheckBoxHandler.cs index ae5f949..600f418 100644 --- a/src/GraphicsControls/Handlers/CheckBox/CheckBoxHandler.cs +++ b/src/GraphicsControls/Handlers/CheckBox/CheckBoxHandler.cs @@ -62,12 +62,12 @@ public static void MapDrawMark(ICanvas canvas, RectF dirtyRect, ICheckBoxDrawabl public static void MapDrawText(ICanvas canvas, RectF dirtyRect, ICheckBoxDrawable drawable, ICheckBox view) => drawable.DrawText(canvas, dirtyRect, view); - public override bool StartInteraction(PointF[] points) + public override void EndInteraction(PointF[] points, bool inside) { - if (VirtualView != null) + if (VirtualView != null && inside) VirtualView.IsChecked = !VirtualView.IsChecked; - return base.StartInteraction(points); + base.EndInteraction(points, inside); } } } \ No newline at end of file diff --git a/src/GraphicsControls/Handlers/Stepper/MaterialStepperDrawable.cs b/src/GraphicsControls/Handlers/Stepper/MaterialStepperDrawable.cs index 6968387..3bedd2a 100644 --- a/src/GraphicsControls/Handlers/Stepper/MaterialStepperDrawable.cs +++ b/src/GraphicsControls/Handlers/Stepper/MaterialStepperDrawable.cs @@ -30,9 +30,13 @@ public void DrawBackground(ICanvas canvas, RectF dirtyRect, IStepper stepper) else { if (Application.Current?.RequestedTheme == AppTheme.Light) - canvas.FillColor = stepper.IsEnabled ? Material.Color.White.ToColor() : Material.Color.Light.Gray6.ToColor(); + canvas.FillColor = stepper.IsEnabled + ? Material.Color.White.ToColor() + : Material.Color.Light.Gray6.ToColor(); else - canvas.FillColor = stepper.IsEnabled ? Material.Color.Dark.Gray1.ToColor().WithAlpha(0.25f) : Material.Color.Dark.Gray2.ToColor().WithAlpha(0.25f); + canvas.FillColor = stepper.IsEnabled + ? Material.Color.Dark.Gray1.ToColor().WithAlpha(0.25f) + : Material.Color.Dark.Gray2.ToColor().WithAlpha(0.25f); } var x = dirtyRect.X; @@ -49,7 +53,7 @@ public void DrawBackground(ICanvas canvas, RectF dirtyRect, IStepper stepper) height = MaterialStepperHeight; width = MaterialStepperWidth / 2; - canvas.FillRoundedRectangle(x, y, width, height, MaterialButtonCornerRadius); + canvas.FillRoundedRectangle(x, y, width, height, MaterialButtonCornerRadius); canvas.RestoreState(); @@ -61,7 +65,9 @@ public void DrawMinus(ICanvas canvas, RectF dirtyRect, IStepper stepper) canvas.SaveState(); canvas.StrokeSize = 1; - canvas.StrokeColor = Application.Current?.RequestedTheme == AppTheme.Light ? Material.Color.Light.Gray6.ToColor() : Material.Color.Dark.Gray6.ToColor(); + canvas.StrokeColor = Application.Current?.RequestedTheme == AppTheme.Light + ? Material.Color.Light.Gray6.ToColor() + : Material.Color.Dark.Gray6.ToColor(); var x = dirtyRect.X; var y = dirtyRect.Y; @@ -77,9 +83,13 @@ public void DrawMinus(ICanvas canvas, RectF dirtyRect, IStepper stepper) var path = vBuilder.BuildPath(MaterialStepperMinusIcon); if (stepper.IsEnabled) - canvas.FillColor = Application.Current?.RequestedTheme == AppTheme.Light ? Material.Color.Black.ToColor() : Material.Color.White.ToColor().WithAlpha(0.5f); + canvas.FillColor = Application.Current?.RequestedTheme == AppTheme.Light + ? Material.Color.Black.ToColor() + : Material.Color.White.ToColor().WithAlpha(0.5f); else - canvas.FillColor = Application.Current?.RequestedTheme == AppTheme.Light ? Material.Color.Light.Gray3.ToColor() : Material.Color.White.ToColor().WithAlpha(0.25f); + canvas.FillColor = Application.Current?.RequestedTheme == AppTheme.Light + ? Material.Color.Light.Gray3.ToColor() + : Material.Color.White.ToColor().WithAlpha(0.25f); canvas.FillPath(path); @@ -93,7 +103,9 @@ public void DrawPlus(ICanvas canvas, RectF dirtyRect, IStepper stepper) canvas.SaveState(); canvas.StrokeSize = 1; - canvas.StrokeColor = Application.Current?.RequestedTheme == AppTheme.Light ? Material.Color.Light.Gray6.ToColor() : Material.Color.Dark.Gray6.ToColor(); + canvas.StrokeColor = Application.Current?.RequestedTheme == AppTheme.Light + ? Material.Color.Light.Gray6.ToColor() + : Material.Color.Dark.Gray6.ToColor(); var x = MaterialStepperWidth / 2 + MaterialButtonMargin; var y = dirtyRect.Y; @@ -109,9 +121,13 @@ public void DrawPlus(ICanvas canvas, RectF dirtyRect, IStepper stepper) var path = vBuilder.BuildPath(MaterialStepperPlusIcon); if (stepper.IsEnabled) - canvas.FillColor = Application.Current?.RequestedTheme == AppTheme.Light ? Material.Color.Black.ToColor() : Material.Color.White.ToColor().WithAlpha(0.5f); + canvas.FillColor = Application.Current?.RequestedTheme == AppTheme.Light + ? Material.Color.Black.ToColor() + : Material.Color.White.ToColor().WithAlpha(0.5f); else - canvas.FillColor = Application.Current?.RequestedTheme == AppTheme.Light ? Material.Color.Light.Gray3.ToColor() : Material.Color.White.ToColor().WithAlpha(0.25f); + canvas.FillColor = Application.Current?.RequestedTheme == AppTheme.Light + ? Material.Color.Light.Gray3.ToColor() + : Material.Color.White.ToColor().WithAlpha(0.25f); canvas.FillPath(path); @@ -122,17 +138,15 @@ public void DrawPlus(ICanvas canvas, RectF dirtyRect, IStepper stepper) public void DrawSeparator(ICanvas canvas, RectF dirtyRect, IStepper stepper) { - } public void DrawText(ICanvas canvas, RectF dirtyRect, IStepper stepper) { - } internal void DrawRippleEffect(ICanvas canvas, RectF dirtyRect, IStepper stepper) { - RectF rect = RectF.Zero; + var rect = RectF.Zero; if (MinusRectangle.Contains(TouchPoint)) rect = MinusRectangle; @@ -149,12 +163,12 @@ internal void DrawRippleEffect(ICanvas canvas, RectF dirtyRect, IStepper stepper canvas.ClipPath(border); - canvas.FillColor = Material.Color.White.ToColor().WithAlpha(0.75f); + var color = stepper.Background?.ToColor() ?? Colors.White; + canvas.FillColor = color?.ComplementaryColor().WithAlpha(0.5f); canvas.Alpha = 0.25f; - float minimumRippleEffectSize = 0.0f; - + const float minimumRippleEffectSize = 0.0f; var rippleEffectSize = minimumRippleEffectSize.Lerp(rect.Width, AnimationPercent); canvas.FillCircle((float)TouchPoint.X, (float)TouchPoint.Y, rippleEffectSize); diff --git a/src/GraphicsControls/Handlers/Switch/SwitchHandler.cs b/src/GraphicsControls/Handlers/Switch/SwitchHandler.cs index 841ad0e..897c3a5 100644 --- a/src/GraphicsControls/Handlers/Switch/SwitchHandler.cs +++ b/src/GraphicsControls/Handlers/Switch/SwitchHandler.cs @@ -13,7 +13,6 @@ public class SwitchHandler : GraphicsControlHandler public SwitchHandler() : base(DrawMapper, PropertyMapper) { - } public SwitchHandler(DrawableType drawableType) : base(DrawMapper, PropertyMapper) @@ -21,18 +20,20 @@ public SwitchHandler(DrawableType drawableType) : base(DrawMapper, PropertyMappe _drawableType = drawableType; } - public static PropertyMapper PropertyMapper = new PropertyMapper(ViewHandler.Mapper) - { - [nameof(ISwitch.IsOn)] = MapIsOn, - [nameof(ISwitch.TrackColor)] = ViewHandler.MapInvalidate, - [nameof(ISwitch.ThumbColor)] = ViewHandler.MapInvalidate - }; + public static PropertyMapper PropertyMapper = + new PropertyMapper(ViewHandler.Mapper) + { + [nameof(ISwitch.IsOn)] = MapIsOn, + [nameof(ISwitch.TrackColor)] = ViewHandler.MapInvalidate, + [nameof(ISwitch.ThumbColor)] = ViewHandler.MapInvalidate + }; - public static DrawMapper DrawMapper = new DrawMapper(ViewHandler.DrawMapper) - { - ["Background"] = MapDrawBackground, - ["Thumb"] = MapDrawThumb - }; + public static DrawMapper DrawMapper = + new DrawMapper(ViewHandler.DrawMapper) + { + ["Background"] = MapDrawBackground, + ["Thumb"] = MapDrawThumb + }; public static string[] DefaultSwitchLayerDrawingOrder = ViewHandler.DefaultLayerDrawingOrder.ToList().InsertAfter(new string[] @@ -64,15 +65,15 @@ public static void MapDrawBackground(ICanvas canvas, RectF dirtyRect, ISwitchDra public static void MapDrawThumb(ICanvas canvas, RectF dirtyRect, ISwitchDrawable drawable, ISwitch view) => drawable.DrawThumb(canvas, dirtyRect, view); - public override bool StartInteraction(PointF[] points) + public override void EndInteraction(PointF[] points, bool inside) { - if (VirtualView != null) + if (VirtualView != null && inside) { VirtualView.IsOn = !VirtualView.IsOn; AnimateToggle(); } - return base.StartInteraction(points); + base.EndInteraction(points, inside); } public static void MapIsOn(IElementHandler handler, ISwitch virtualView) @@ -89,7 +90,7 @@ void UpdateIsOn() Invalidate(); } else - AnimateToggle(); + AnimateToggle(); } internal void AnimateToggle() diff --git a/src/GraphicsControls/Platform/ColorExtensions.cs b/src/GraphicsControls/Platform/ColorExtensions.cs index 4d60964..80a9252 100644 --- a/src/GraphicsControls/Platform/ColorExtensions.cs +++ b/src/GraphicsControls/Platform/ColorExtensions.cs @@ -61,5 +61,20 @@ public static Color ContrastColor(this Color color) // Return black for bright colors, white for dark colors return luma > 0.5 ? Colors.Black : Colors.White; } + + /// + /// Returns a color which is visible on top of the current color. + /// If the current color is dark, returns white. If the current color is light, returns black. + /// + /// Color on which we want to base returned color. + /// Can return Colors.Black or Colors.White + public static Color ComplementaryColor(this Color color) + { + if(color == null) + return Colors.Black; + + color.ToHsl(out _, out _, out var lightness); + return lightness > 0.4 ? Colors.Black : Colors.White; + } } } \ No newline at end of file