Skip to content

Commit 3f58564

Browse files
committed
removed the thing I thought was smart but turned out to be stupid
Removed coerce value and PropertyChanged delegate on Color and Opacity properties. Initially just the Color property was taken into account in the renderers, it was built up from Opacity property changed. That was a mistake since it can sometimes breaks the notify property changed mechanism (for example if you set opacity to 1).
1 parent 5a470bc commit 3f58564

File tree

11 files changed

+57
-44
lines changed

11 files changed

+57
-44
lines changed

Sample/ShadowsSample/Views/DynamicShadows.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ private void AddShade(object sender, EventArgs e)
100100
}
101101

102102
((ObservableCollection<Shade>)CatShadows.Shades).Add(
103-
new Shade { Offset = new Point(xOffset, yOffset), Color = color, BlurRadius = blur });
103+
new Shade { Offset = new Point(xOffset, yOffset), Color = color, Opacity = opacity, BlurRadius = blur });
104104

105105
ShadeInfos.Add(new ShadeInfo($"{xOffset},{yOffset}", color, blur.ToString()));
106106
}

Shadows/Shadows.Droid/ShadowView.PropertyChanged.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,11 @@ private void ShadePropertyChanged(object sender, PropertyChangedEventArgs e)
130130
return;
131131
}
132132

133+
if (!Shade.IsShadeProperty(e.PropertyName))
134+
{
135+
return;
136+
}
137+
133138
var shade = (Shade)sender;
134139
var index = _shadesSource.IndexOf(shade);
135140
if (index < 0)
@@ -144,6 +149,7 @@ private void ShadePropertyChanged(object sender, PropertyChangedEventArgs e)
144149
{
145150
case nameof(Shade.BlurRadius):
146151
case nameof(Shade.Color):
152+
case nameof(Shade.Opacity):
147153
DrawBitmap(index, shade);
148154
Invalidate();
149155
break;

Shadows/Shadows.Droid/ShadowView.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ public static ShadeInfo FromShade(Context context, Shade shade)
325325
// float blurCoeff = 1f + (float)shade.BlurRadius / 20f;
326326

327327
return new ShadeInfo(
328-
shade.Color.ToAndroid(),
328+
shade.Color.MultiplyAlpha(shade.Opacity).ToAndroid(),
329329
context.ToPixels(shade.BlurRadius) * 2,
330330
context.ToPixels(shade.Offset.X),
331331
context.ToPixels(shade.Offset.Y));

Shadows/Shadows.Tizen/TizenShadowsRenderer.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,11 @@ void UpdateGeometry()
122122
if (bottom < sb) bottom = sb;
123123
}
124124

125-
var canvasGeometry = new Rect(geometry.X + (int)left, geometry.Y + (int)top, geometry.Width + (int)right - (int)left, geometry.Height + (int)bottom - (int)top);
125+
var canvasGeometry = new Rect(
126+
geometry.X + (int)left,
127+
geometry.Y + (int)top,
128+
geometry.Width + (int)right - (int)left,
129+
geometry.Height + (int)bottom - (int)top);
126130
if (_canvasView != null)
127131
{
128132
_canvasView.Geometry = canvasGeometry;
@@ -163,7 +167,13 @@ void OnPaintSurface(object sender, SKPaintSurfaceEventArgs e)
163167

164168
canvas.Save();
165169
canvas.ClipPath(path, SKClipOperation.Difference, true);
166-
paint.ImageFilter = SKImageFilter.CreateDropShadow(scaledOffsetX, scaledOffsetY, scaledBlurRadius, scaledBlurRadius, shade.Color.ToSK(), SKDropShadowImageFilterShadowMode.DrawShadowOnly);
170+
paint.ImageFilter = SKImageFilter.CreateDropShadow(
171+
scaledOffsetX,
172+
scaledOffsetY,
173+
scaledBlurRadius,
174+
scaledBlurRadius,
175+
shade.Color.MultiplyAlpha(shade.Opacity).ToSK(),
176+
SKDropShadowImageFilterShadowMode.DrawShadowOnly);
167177
canvas.DrawPath(path, paint);
168178
canvas.Restore();
169179

@@ -204,6 +214,11 @@ void UpdateCornerRadius(bool initialize)
204214

205215
void ShadePropertyChanged(object sender, PropertyChangedEventArgs e)
206216
{
217+
if (!Shade.IsShadeProperty(e.PropertyName))
218+
{
219+
return;
220+
}
221+
207222
var shade = (Shade)sender;
208223
var index = _shadesSource.IndexOf(shade);
209224
if (index < 0)
@@ -217,6 +232,7 @@ void ShadePropertyChanged(object sender, PropertyChangedEventArgs e)
217232
{
218233
case nameof(Shade.BlurRadius):
219234
case nameof(Shade.Color):
235+
case nameof(Shade.Opacity):
220236
case nameof(Shade.Offset):
221237
UpdateGeometry();
222238
break;

Shadows/Shadows.UWP/UWPShadowsController.PropertyChanged.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,11 @@ private void ShadePropertyChanged(object sender, PropertyChangedEventArgs e)
127127
return;
128128
}
129129

130+
if (!Shade.IsShadeProperty(e.PropertyName))
131+
{
132+
return;
133+
}
134+
130135
var shade = (Shade)sender;
131136
var index = _shadesSource.IndexOf(shade);
132137
if (index < 0)
@@ -140,6 +145,7 @@ private void ShadePropertyChanged(object sender, PropertyChangedEventArgs e)
140145
{
141146
case nameof(Shade.BlurRadius):
142147
case nameof(Shade.Color):
148+
case nameof(Shade.Opacity):
143149
case nameof(Shade.Offset):
144150
UpdateShadeVisual(index, shade);
145151
break;

Shadows/Shadows.UWP/UWPShadowsController.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,6 @@ private void DestroyShadows()
9595
}
9696
}
9797

98-
99-
10098
private void InsertShade(int insertIndex, Shade shade)
10199
{
102100
shade.PropertyChanged -= ShadePropertyChanged;
@@ -132,7 +130,7 @@ private void InsertShade(int insertIndex, Shade shade)
132130

133131
var dropShadow = _compositor.CreateDropShadow();
134132
dropShadow.BlurRadius = (float)shade.BlurRadius * 2;
135-
dropShadow.Opacity = 1;
133+
dropShadow.Opacity = (float)shade.Opacity;
136134
dropShadow.Color = shade.Color.ToWindowsColor();
137135
dropShadow.Offset = new Vector3((float)shade.Offset.X - SafeMargin, (float)shade.Offset.Y - SafeMargin, 0);
138136
dropShadow.Mask = shadowHost.GetAlphaMask();
@@ -188,7 +186,7 @@ private void UpdateShadeVisual(int index, Shade shade)
188186
{
189187
var dropShadow = (DropShadow)_shadowVisuals[index].Shadow;
190188
dropShadow.BlurRadius = (float)shade.BlurRadius;
191-
dropShadow.Opacity = 1;
189+
dropShadow.Opacity = (float)shade.Opacity;
192190
dropShadow.Color = shade.Color.ToWindowsColor();
193191
dropShadow.Offset = new Vector3((float)shade.Offset.X, (float)shade.Offset.Y, 0);
194192
}

Shadows/Shadows.iOS/ShadeExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public static CALayer ToCALayer(this Shade shade)
1919
ShadowColor = shade.Color.ToCGColor(),
2020
ShadowRadius = (nfloat)shade.BlurRadius / UIScreen.MainScreen.Scale,
2121
ShadowOffset = new CGSize(shade.Offset.X, shade.Offset.Y),
22-
ShadowOpacity = 1,
22+
ShadowOpacity = (float)shade.Opacity,
2323
MasksToBounds = false,
2424
RasterizationScale = UIScreen.MainScreen.Scale,
2525
ShouldRasterize = true,

Shadows/Shadows.iOS/iOSShadowsController.PropertyChanged.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,11 @@ private void ShadePropertyChanged(object sender, PropertyChangedEventArgs e)
132132
return;
133133
}
134134

135+
if (!Shade.IsShadeProperty(e.PropertyName))
136+
{
137+
return;
138+
}
139+
135140
var shade = (Shade)sender;
136141
var index = _shadesSource.IndexOf(shade);
137142
if (index < 0)
@@ -145,6 +150,7 @@ private void ShadePropertyChanged(object sender, PropertyChangedEventArgs e)
145150
{
146151
case nameof(Shade.BlurRadius):
147152
case nameof(Shade.Color):
153+
case nameof(Shade.Opacity):
148154
case nameof(Shade.Offset):
149155
UpdateShadeLayer(index, shade);
150156
break;

Shadows/Shadows/AssemblyInfo.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
//------------------------------------------------------------------------------
22
// <auto-generated>
3-
// Ce code a été généré par un outil.
4-
// Version du runtime :4.0.30319.42000
3+
// This code was generated by a tool.
4+
// Runtime Version:4.0.30319.42000
55
//
6-
// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si
7-
// le code est régénéré.
6+
// Changes to this file may cause incorrect behavior and will be lost if
7+
// the code is regenerated.
88
// </auto-generated>
99
//------------------------------------------------------------------------------
1010

Shadows/Shadows/Shade.cs

Lines changed: 10 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -15,42 +15,13 @@ public class Shade : Element
1515
nameof(Color),
1616
typeof(Color),
1717
typeof(Shade),
18-
defaultValueCreator: _ => DefaultColor,
19-
coerceValue: (bo, v) =>
20-
{
21-
var shade = (Shade)bo;
22-
var color = (Color)v;
23-
if (shade.Opacity < 1 && color.A == 1f)
24-
{
25-
// Color is plain and a Opacity is set, add Alpha
26-
return color.MultiplyAlpha(shade.Opacity);
27-
}
28-
29-
return color;
30-
},
31-
propertyChanged: (bo, oldValue, newValue) =>
32-
{
33-
var shade = (Shade)bo;
34-
var color = (Color)newValue;
35-
if (color.A < 1 && shade.Opacity == 1f)
36-
{
37-
// Color has alpha and a Opacity is not set, update Opacity
38-
shade.Opacity = color.A;
39-
}
40-
});
18+
defaultValueCreator: _ => DefaultColor);
4119

4220
public static readonly BindableProperty OpacityProperty = BindableProperty.Create(
4321
nameof(Opacity),
4422
typeof(double),
4523
typeof(Shade),
46-
defaultValue: DefaultOpacity,
47-
propertyChanged: (bo, oldValue, newValue) =>
48-
{
49-
var shade = (Shade)bo;
50-
var previousColor = shade.Color;
51-
var newOpacity = (double)newValue;
52-
shade.Color = new Color(previousColor.R, previousColor.G, previousColor.B, newOpacity);
53-
});
24+
defaultValue: DefaultOpacity);
5425

5526
public static readonly BindableProperty BlurRadiusProperty = BindableProperty.Create(
5627
nameof(BlurRadius),
@@ -90,6 +61,14 @@ public double BlurRadius
9061
set => SetValue(BlurRadiusProperty, value);
9162
}
9263

64+
public static bool IsShadeProperty(string propertyName)
65+
{
66+
return propertyName == nameof(Offset)
67+
|| propertyName == nameof(Color)
68+
|| propertyName == nameof(Opacity)
69+
|| propertyName == nameof(BlurRadius);
70+
}
71+
9372
public override string ToString()
9473
{
9574
var builder = new StringBuilder();

0 commit comments

Comments
 (0)