Custom Renderer or Effects?

写在前面:

之前给大家介绍过在如何针对 Xamarin.Forms 提供的控件进行自定义 UI 样式渲染以及功能的拓展,其中有 Renderer, Behaviors, Effects, Triggers 等方法, 如果大家还不是很了解这些可以查看之前的博客 Composable Customizations with Xamarin.Forms。对于 BehaviorsTriggers 通常很好区分它们的使用环境,但是对于 EffectsRenderer 的选择就令人很纠结了,今天我们就将对比一下两者的使用。

Custom Renderer or Effects?_第1张图片

举个栗子

首先我们拿一个 Xamarin.Forms 的常用案例,自定义 Entry 样式,在 iOSEntry 的样式为:

如果我们想给 Entry 自定义 Border 颜色,你会发现在 Xamarin.Forms 中并没有提供给我们直接的属性或者方法去改变,通常我们会选择 RendererEffects 去修改控件的 UI 或 添加属性和方法:

Custom Renderer or Effects?_第2张图片

Renderer
  1. 新建 一个控件:
Custom Renderer or Effects?_第3张图片
  1. 在平台层分别实现相应的渲染:
  • 分别在平台层添加类文件:

    Custom Renderer or Effects?_第4张图片
  • 选择对应控件的 Renderer 实现原生控件的自定义渲染,例如,如果你想修改 BoxView,你将不得选择 BoxRenderer 扩展,它基本上等于使用原生 iOS中的 UIViewAndroid中的 ViewGroup

Custom Renderer or Effects?_第5张图片

所以我们这里选择 EntryRenderer 进行自定义渲染:

Custom Renderer or Effects?_第6张图片
  • 添加自定义渲染的代码:

我们需要重写 OnElementChanged 方法并在那里添加我们的自定义代码。如果我们想要在运行时处理属性更改,那么也需要重写 OnElementPropertyChanged 方法并在那里添加属性处理代码:

Custom Renderer or Effects?_第7张图片
  • 添加 ExportRenderer 属性:
Custom Renderer or Effects?_第8张图片

注意事项:
很多刚开始接触 Xamarin.Forms 的开发者在满心欢喜的写完平台层的自定义渲染的代码后,运行程序发现并没有效果,就开始质疑自己自定义渲染代码的问题,又开始需要下一个实现方式。殊不知代码没有什么问题,只是没有让程序去使用这部分代码。上边 ExportRenderer 第一个参数表明运用 Renderer 到哪个控件上,第二个是 Renderer 的类型。大部分 Renderer 失效都是由于少了这一行代码。

  1. 使用控件:
Custom Renderer or Effects?_第9张图片
Effect

使用 Effect 的步骤基本与 Renderer 相同,也是三步:

  1. 创建一个新的 RoutingEffect 类:
Custom Renderer or Effects?_第10张图片

其中 GroupName 每个项目只有一个,EffectName 代表当前 Effect

  1. 在平台层分别实现相应的渲染:
  • 在每个平台中创建一个新的效果类继承 PlatformEffect
Custom Renderer or Effects?_第11张图片

其中包括三个方法:

  • OnAttached:在附加效果时发生,在这里您将添加自定义代码
  • OnDetached:在分离效果时发生,在这里您将清除OnAttached方法上完成的自定义
  • OnElementPropertyChanged:在运行时处理属性更改
  • OnAttached / OnDetached 方法中添加自定义代码 :
Custom Renderer or Effects?_第12张图片
  • 为您的效果添加 Assembly 属性:
Custom Renderer or Effects?_第13张图片

其中我们需要添加 ResolutionGroupName,也就是上边说到的项目唯一组名,以及 ExportEffect 属性告知哪个 Platform Effect 运用到哪个 RoutingEffect 上。

  1. 使用:
Custom Renderer or Effects?_第14张图片

Differences

  1. 进行部分样式更改,或进行简单的 UI 样式调整时,例如 阴影,背景色,边框等,首选 Effect
  2. 当需要创建新的控件,例如 画图板,VideoPlayer, MusicPlayerForms 中不直接提供的控件,或需要访问更多原生的方法,如 TouchBegan, TouchMoved, TouchEnded 等方法时,首选 Renderer
  3. 当不同的控件都需要添加项目的功能或样式时,例如 Entry 和 Editor 都需要捕获键盘即将出现和将要消失的通知事件,首选 Effect
  4. 当你想写更少的代码,强调代码的复用性,以及后期的易维护性,首选Effect

Reference

  • custom-renderers-vs-effects-in-xamarin-forms
  • customizing-xamarin-forms-controls-with-effects
  • Xamarin.Forms Custom Renderer
  • Xamarin.Forms Effect
  • xamarin-forms-triggers-behaviors-effects

到这里在 Custom Renderer or Effects? 就介绍完了,希望能对您有所帮助。


——End 有问题可以加我微信,大家一起讨论,加好友前请备注您的简称,谢谢!

Custom Renderer or Effects?_第15张图片

你可能感兴趣的:(Custom Renderer or Effects?)