
Я хочу, чтобы тень была круглой, соответствующей круглому изображению, помещенному поверх нее.
Я могу сделать изображение круглым, используя этот код:
Код: Выделить всё
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;
}

Теперь мне нужно сделать тень круглой. Я использовал следующий код:
Если я использую:
Код: Выделить всё
_colorShadowBrush.SetSourceParameter("mask", imageBrush.Mask);
Код: Выделить всё
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);
}

Как видите, вместо мягкого свечения тени получается размытое кольцо!
Итак, как мне получить первое изображение, но с круглой тенью?
/>Полный исходный код можно найти здесь и здесь. Меня устраивает код UWP или WinUI, так что это не имеет значения.
Подробнее здесь: https://stackoverflow.com/questions/798 ... l-circular
Мобильная версия