在Xamarin.Forms中,可以将Effect
附加到Effect
。就我而言,视图正在显示View
。效果是在图像的可见像素周围产生了彩色的“发光”。 XAML:
Image
效果被实现为<Image Source="{Binding LogoImage}" ...>
<Image.Effects>
<effects:GlowEffect Radius="5" Color="White" />
</Image.Effects>
</Image>
的子类:
RoutingEffect
[在每个平台上,都有一个public class GlowEffect : Xamarin.Forms.RoutingEffect
{
public GlowEffect() : base("Core.ImageGlowEffect")
{
}
...
}
来实现效果。对于iOS:
PlatformEffect
如果动态更改using ...
[assembly: ExportEffect(typeof(Core.Effects.ImageGlowEffect), "ImageGlowEffect")]
namespace Core.Effects
{
public class ImageGlowEffect : PlatformEffect
{
protected override void OnAttached()
{
ApplyGlow();
}
protected override void OnElementPropertyChanged( PropertyChangedEventArgs e )
{
base.OnElementPropertyChanged( e );
if (e.PropertyName == "Source") {
ApplyGlow();
}
}
private void ApplyGlow()
{
var imageView = Control as UIImageView;
if (imageView.Image == null)
return;
var effect = (GlowEffect)Element.Effects.FirstOrDefault(e => e is GlowEffect);
if (effect != null) {
CGRect outSize = AVFoundation.AVUtilities.WithAspectRatio( new CGRect( new CGPoint(), imageView.Image.Size ), imageView.Frame.Size );
...
}
}
...
}
}
,则上述代码有效:Source
更改时,Source
(UIImageView
或Bounds
)具有大小。但是,如果在XAML中静态设置了Source,则该逻辑不会运行:因此,对Frame
的唯一调用是在ApplyGlow
期间。不幸的是,在OnAttach
期间,OnAttach
的大小为UIImageView
。
如何在具有静态(0, 0)
的iOS上获得这种效果?
注意:等效的Android效果通过附加到Source
的处理程序起作用-此时大小已知。因此,如果有一个iOS等效事件,那将是解决问题的一种方法。
更多详细信息:
原始实现使用原始图像大小(imageView.Image.Size)-在ImageView.ViewTreeObserver.PreDraw
期间可用。可以使它“起作用”,但并不令人满意:将辉光应用于完整尺寸的图像。如果图像明显大于视图区域,则辉光的半径会变得太小(iOS在渲染时会缩小图像+辉光):它的外观不理想。
OnAttach
可以选择对图像应用色彩。该颜色与发光颜色不同。我之所以这样说是因为它限制了可能的解决方案:AFAIK,不能只在图像上设置选项并让iOS弄清楚如何呈现它-需要显式调整图像的大小并在模糊版本的顶部绘制经过调整大小的着色图像(光辉)。该代码全部有效-if ApplyGlow
(或imageView.Bounds.Size
)可用(且非零)。
在imageView.Frame.Size
中有一个断点,我检查了是否始终设置的任何属性都知道imageView的大小。没有;如果没有动态设置任何属性,则属性更改全部在imageView具有大小之前发生。
也许这是解决方法
,但我不知道您是否可以接受。