Xamarin.Formsのリリースから約2年、当初よりもプラットフォームごとのカスタマイズ手段が増えてきたので、ここでちょっと整理してみようと思います。
目次
他に忘れてる物があったら教えてください。
- OnPlatform (XF 1.0 ~)
- DependecyService (XF 1.0 ~)
- Plugins for Xamarin
- Custom Renderer (XF 1.0 ~)
- Effects (XF 2.1 ~)
- Native Embedding (XF 2.2 ~)
OnPlatform
プラットフォーム毎に個別の処理をしたり、値を返すのに使います。 PCL、Shared、XAMLどの場面でも使えて、個別にパラメータを設定するのに活躍します。
- Xamarinのドキュメント
- XAMLでOnPlatformを使うときのドキュメント
DependecyService
DependecyServiceは一種のDIサービスです。 テキスト読み上げのような、プラットフォーム固有APIを呼ぶサービスを実装するのに向いていると思います。
- 共通プロジェクトにInterfaceを定義
- プラットフォームプロジェクトでInterfaceを実装をしてDependencySeviceに登録
- 共通プロジェクトでDependencyServiceから固有実装のインスタンスを取得
- Xamarinのドキュメント
Plugins for Xamarin
「Bait and Switch」と呼ばれるトリックを利用してクロスプラットフォームなライブラリを作る仕組みです。 実装方法がやや複雑ですがテンプレートが用意されているので大丈夫。(Visual Studio用)
DependecyService同様、プラットフォーム固有APIを呼ぶサービスを実装するのに向いていると思います。 こちらはXamrin.Formsに依存しておらず、Windowsをターゲットに含めることも可能です。
個人的にはDependecyServiceよりも、こちらでNuGetパッケージまで作ってしまうことをお勧めします。 (公開せずにローカルリポジトリで運用してもOK)
当ブログでも取り上げました。
Custom Renderer
Xamarin.FormsのViewは、抽象化されたビュー、レンダラー、ネイティブコントロールから成り立っており、レンダラーが抽象ビューに対応するネイティブコントロールの生成などを行っています。 この仕組みを使えば独自コントロールの作成から、既存コントロールのカスタマイズまであらゆる局面に対応可能です。(標準のPageやViewもこの仕組みで作られています)
反面、些細なカスタマイズには大げさで面倒だと言えます。
- Xamarinのドキュメント
Effects
EffectsはXamarin.Forms 2.1から追加された、Viewのカスタマイズに最適な仕組みです。 Viewに添付されたEffectはXamarin.Forms側のコントロール、ネイティブ側のコントロール双方にアクセスすることができます。
生成済みコントロールに後付けする形で使用するため、インスタンス生成時の処理には介入できません。
- Xamarinのドキュメント
- Xamarin.Formsのブログ
当ブログでも取り上げました。
Native Embedding
Native EmbeddingはXamarin.Forms 2.2から追加された仕組みです。Evolve 2016のキーノートでも紹介されました。 Sharedプロジェクトに限り、Xamarin.Formsレイアウトの中にネイティブコントロールを混ぜ込むことができます。
Shared限定なので再利用性は低く、基本的にそのアプリケーション限定の利用となるでしょう。
- Xamarinのドキュメント
当ブログでも取り上げました。