
Ich möchte, dass der Schatten kreisförmig ist und dem darüber platzierten kreisförmigen Bild entspricht.
Ich kann das Bild mit diesem Code kreisförmig machen:
Code: Select all
var imageBrush = await MakeCircularAsync(_imageSurface, _imageVisual.Size);
_imageVisual.Brush = imageBrush;
_colorShadowBrush.SetSourceParameter("source", imageBrush.Source);
private async Task MakeCircularAsync(IImageSurface imageSurface, Vector2 targetSize)
{
if (imageSurface == null)
return null;
if (_compositor == null)
{
_compositor = CompositionTarget.GetCompositorForCurrentThread();
_generator = _compositor.CreateCompositionGenerator();
}
float diameter = Math.Min(targetSize.X, targetSize.Y);
var radius = diameter / 2f;
var ellipse = CanvasGeometry.CreateCircle(
_generator.Device,
new Vector2(targetSize.X / 2f, targetSize.Y / 2f),
radius);
var maskSurface = _generator.CreateMaskSurface(targetSize.ToSize(), null);
maskSurface.Redraw(targetSize.ToSize(), ellipse);
var maskBrush = _compositor.CreateSurfaceBrush(maskSurface);
var sourceBrush = _compositor.CreateSurfaceBrush(imageSurface);
sourceBrush.Stretch = CompositionStretch.Fill;
var circularBrush = _compositor.CreateMaskBrush();
circularBrush.Source = sourceBrush;
circularBrush.Mask = maskBrush;
return circularBrush;
}

Jetzt muss ich den Schatten kreisförmig machen. Ich habe den folgenden Code verwendet:
Wenn ich verwende:
Code: Select all
_colorShadowBrush.SetSourceParameter("mask", imageBrush.Mask);
Code: Select all
UpdateColorShadowMask(_colorShadowVisual.Size);
private void UpdateColorShadowMask(Vector2 shadowSize)
{
float diameter = Math.Min(shadowSize.X, shadowSize.Y);
var radius = diameter / 2f;
var circle = CanvasGeometry.CreateCircle(
_generator.Device,
new Vector2(shadowSize.X / 2f, shadowSize.Y / 2f),
radius - 10);
if (_colorShadowMaskSurface == null)
_colorShadowMaskSurface = _generator.CreateMaskSurface(shadowSize.ToSize(), null);
_colorShadowMaskSurface.Redraw(shadowSize.ToSize(), circle);
var maskBrush = _compositor.CreateSurfaceBrush(_colorShadowMaskSurface);
_colorShadowBrush.SetSourceParameter("mask", maskBrush);
}

Wie Sie sehen können, gibt es einen verschwommenen Ring anstelle einer sanft leuchtenden Schattenfarbe!
Wie kann ich also das erste Bild erreichen, aber mit einem kreisförmigen Schatten?
Den vollständigen Quellcode finden Sie hier und hier. Ich komme sowohl mit UWP- als auch mit WinUI-Code zurecht, es spielt also keine Rolle.
Mobile version