Xamarin.Forms でプラットフォーム固有の機能を実装する(カスタムレンダラー編)
Xamarin.Formsでは各プラットフォーム固有の機能を使用する方法として、主に2つの方法があります。
- カスタムレンダラー
- DependencyService
カスタムレンダラーは、Xamarin.Formsの既存のビューを拡張する場合などに使用します。
ここでは、Xamarin.FormsのImage
の色を変更する方法をカスタムレンダラーで実装します。
サンプルはこちら
手順
- 共通プロジェクトにカスタム元のビューを用意する
- 各プラットフォームにカスタム用のカスタムレンダラーを用意する
- 共通プロジェクトにカスタマイズ用のパラメータを追加する
- 各プラットフォームのカスタムレンダラーにカスタム内容を記述する
共通プロジェクトにカスタム元のビューを用意する
Xamarin.FormsでImageをカスタマイズする(共通プロジェクト)
カスタムレンダラーを使用するにはまず、共通プロジェクトに、Xamarin.Formsのビューを継承したビューを用意します。
(以下、このビューをForms側ビューと呼びます。)
今回はImage
を継承したCustomImage
を用意しました。
各プラットフォームにカスタム用のカスタムレンダラーを用意する
- Forms側ビューのレンダラーに対応した、各プラットフォームのレンダラーを継承したカスタムレンダラークラスを作成する
ExportRenderer
属性を使用して、Forms側ビューのレンダラーを↑で作成したカスタムレンダラーに変更する
Xamarin.FormsでImageをカスタマイズする(カスタムレンダラー、Android)
この段階でビルドすると、まだ何もカスタマイズしていないので、設定した画像がそのまま表示されます。
共通プロジェクトにカスタマイズ用のパラメータを追加する
Xamarin.FormsでImageをカスタマイズする(共通プロジェクト)
画像の色を変更するためのImageColor
というプロパティを用意しました。
各プラットフォームのカスタムレンダラーにカスタム内容を記述する
カスタムレンダラーでは主に2つの関数をOverrideして使用します。
OnElementChanged
: 初期化時の処理を実装OnElementPropertyChanged
: プロパティ値が変化する都度の処理を実装
Xamarin.FormsでImageをカスタマイズする(カスタムレンダラー、Android)
Xamarin.FormsでImageをカスタマイズする(カスタムレンダラー、iOS)
ここでは、
Androidでは、OnElementChanged
で画像の色を変更する処理をしています。
iOSでは、OnElementPropertyChanged
で画像の色を変更する処理をしています。
iOSではOnElementChanged
の段階では、image
の準備が完了していないためです。
以上で、カスラムレンダラーを使用して、Xamarin.FormsのImage
のカラーが変更できるようになりました。
Xamarin.Forms でComponentを追加する
Xamarin.FormsにはComponent Storeがあります。 そこから、コンポーネントを入手することで、各種処理の実装を簡単に行えるようになります。 ストアには有償のものも、無償のものもあります。
Google Maps コンポーネントをiOSのプロジェクトに追加する方法を例にまとめます。
手順
Component Store にアクセスする
- 追加したいプロジェクト(今回はiOS)の「Components」フォルダにアクセスします。
- 「オプション」画面を開いて「Get More Components」を選択します。
- Xamarin Components のウィンドウが開きます。
コンポーネントを探す
コンポーネントは左上の検索欄に入力することで、検索することができます。
目的のものが見つかったら選択して、次にいきます。
コンポーネントをプロジェクトに追加する
コンポーネントの詳細ページの「Add to App」をボタンを選択することで、コンポーネントの追加が始まります。
追加されたコンポーネントを確認する
追加が完了すると「Components」フォルダにコンポーネントが追加されます。
また、コンポーネントの使用方法や、サンプルが確認できる画面が表示されます。
必要に応じてサンプルなどをダウンロードしましょう。
以上で、コンポーネントの追加は完了です。
Xamarin.Forms でMapを表示する
Xamarin.FormsでMapを表示するには、"Xamarin.Forms.Maps"コントロールを使用します。
これを使用することで、iOSではApple Map、AndroidではGoogle Mapを容易に使用することができます。
サンプルはこちら
手順
- "Xamarin.Forms.Maps"パッケージをプロジェクトに追加する
- "Xamarin.Froms.Map"を初期化する
- Map表示用のページを作成する
- 各プロジェクトごとに必要な設定を行う
- Androidの設定
- パーミッションを設定する
- 最大ヒープサイズを設定する
- アプリケーションキーを設定する
- iOSの設定
- 位置情報を使用するための権限取得メッセージを設定する
- Androidの設定
Xamarin.Forms.Maps パッケージをプロジェクトに追加
"Xamarin.Forms.Maps"を使用するには、プロジェクトにからパッケージを追加する必要があります。
パッケージは「NuGet」から取得することができます。
- PCLプロジェクトで、設定メニューを表示する。
- 「追加」→「Add NuGet Packages...」と選択肢、NuGet追加の画面を表示する。
- 「Official NuGet Gallery」を選択し、検索欄に「xamarin forms maps」と入力して検索する。
- "Xamarin.Forms.Maps"パッケージをチェックボックスで選択し、「Add Package」で完了させる。
iOS、Androidの各プロジェクトで同様の操作を繰り返します。
完了すると、Mapの利用に必要なパッケージも同時に追加されます。
Xamarin.Forms.Map の初期化
Xamarin.Forms.Mapを使用するには、プラットフォームごとに初期化コードを実装する必要があります。
Androidの初期化コード
Androidは「MainActivity.cs」ファイルに追加します。
Xamarin.Formsでマップを初期化する (Android、MainActivity.cs)
iOSの初期化コード
iOSは「AppDelegate.cs」ファイルに追加します。
Xamarin.Formsでマップを初期化する (iOS、AppDelegate.cs)
Mapページの実装
Mapを表示するためのページを作成します。
iOSの場合は、この段階でマップを表示することができます。 ビルドして確認してみましょう。 Androidの場合は、もう少し作業が必要なので次に進みましょう。
各プロジェクトごとの設定
Android
パーミッションの設定
AndroidでMapを使用するには3つのの権限が必要です。
- AccessFineLocation
- AccessNetworkState
- Internet
- 「Properties」フォルダの「AndroidManifest.xml」を開きます。
- 「Required permissions」内の上記項目をチェックすると完了です。
最大ヒープサイズの設定
ヒープの最大サイズを設定していない場合、コンパイルエラーになることがあります。
UNEXPECTED TOP-LEVEL ERROR: java.lang.OutOfMemoryError: Java heap space
- Androidプロジェクトのオプション画面を表示します。
- 「ビルド」の「Android Build」を選択し、「Advanced」タブを開きます。
- 「Additional Options」の「Java heap size:」に「1G」と設定しましょう。
これで、このエラーは解決します。
アプリケーションキーの設定
Androidでは、「Google Maps API v2」を使用します。
これを使用するには、「Google API」のキーを取得し、設定する必要があります。
取得方法については、別にまとめてあるのでそちらを参照してください。
取得したキーの設定を行います。
- 「Properties」フォルダの「AndroidManifest.xml」を開きます。
- 「ソース」タブを選択します。
- 「application」タグの間に上記のように「meta-data」タグを挿入します。
- <取得したAPI Keyをここに書く>の部分にキーを入力して完了です。
iOS
iOSでは、マップを表示するだけなら特に権限は必要ありません。
しかし、現在地の表示などで位置情報を使用する場合は、位置情報使用のための権限を得る必要があります。
位置情報使用のための権限の取得
iOSで位置情報を使用するためには、2つのうちのどちらかの権限が必要です。
アプリに合わせて実装しましょう。
- NSLocationAlwaysUsageDescription
常に許可 (バックグラウンド時にも使用できます) - NSLocationWhenInUseUsageDescription
このアプリ使用時のみに許可
「NSLocationAlwaysUsageDescription 」を設定する方法を例にあげます。
- 「Info.plist」を開き、「ソース」タブを選択します。
- 「Add New entry」を選択し、「+」ボタンを押します。
- 「Custom Property」と表示された部分を選択すると、矢印ボタンからアイテムリストが表示されます。
- 「NSLocationAlwaysUsageDescription」を選択します。
- 「String」に「位置情報の使用を常に許可します」と入力します。
これはアプリ起動時に「位置情報の使用を常に許可する」権限を得るためのメッセージ表示に使用されます。
メッセージには「String」に設定した文言が表示されます。
アプリに合わせて自由に設定してください。
これで、現在地表示など、位置情報を使用した地図も表示することができます。
Google Map API を使用するためのAPIキーを作成する
Google Mapを使用するためには、Google Map API を使用します。
また、Google Map API を使用するためには APIキーを作成する必要があります。
今回は、Google Map API を使用するためのAPIキーの作成方法をまとめました。
手順
Androidでの準備
SHA1 証明書フィンガープリントの取得
Google API のAPIキーを取得するには、
AndroidのキーストアからSHA1 証明書フィンガープリントを取得する必要があります。
Xamarinの場合、キーストアは下記にあります。
*1
/Users/<ユーザー名>/.local/share/Xamarin/Mono for Android/debug.keystore
SHA1 証明書フィンガープリントの取得には「keytool」コマンドを使用します。 「ターミナル」で下記のようにコマンドを実行しましょう。
keytool -list -v -keystore /Users/<USERNAME>/.local/share/Xamarin/Mono\ for\ Android/debug.keystore -alias androiddebugkey -storepass android -keypass android
<USERNAME>の部分は自分の環境に書き換えてください。
下記のような結果が表示されます。
「SHA1」の部分がSHA1 証明書フィンガープリントとなります。
後で使用するので、値をメモしておきましょう。
パッケージ名の取得
APIキーは、「SHA1 証明書フィンガープリント」と「パッケージ名」のセットで取得します。
Androidプロジェクトのパッケージ名をメモしておきましょう。
パッケージ名は、
「Properties/AndroidManifest.xml」の「package="パッケージ名"」のパッケージ名の部分です。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0"
package="com.mattsuDev.XamarinFormsMapSample">
iOSでの準備
バンドルIDの取得
iOS用のAPIキーの作成には、バンドルIDが必要になります。
バンドルIDは「Info.plist」の「Bundle identifier」に設定されているものです。
APIの有効化
Google API Console へのアクセス
APIキーに関する操作は、Google API Consoleで行います。
アクセスしてください。
下記のような画面が表示されるので、「Create Project」を選択します。
自動的にプロジェクトが作成されます。
APIの有効化
APIキーを使用するためには、使用したいAPIを有効化する必要があります。
「Enable Google APIs for use in your apps」を選択します。
Androidなら「Google Maps Android API」を、
iOSなら「Google Maps SDK for iOS」を選択します。
「APIを有効にする」ボタンを押します。
有効なAPIに追加されれば完了です。
APIへアクセスするためのキーを作成
有効にしたAPIにアクセスするためのキーを作成します。
左側のメニューから「APIと認証」→「認証情報」と選択します。
「公開APIへのアクセス」の「新しいキー」を作成ボタンを押します。
「新しいキーの作成」ダイアログが表示されます。
Androidの場合
「Android key」を選択します。
下記のような画面が表示されるので、アクセスを許可するアプリの登録を行います。
事前に用意しておいた、「SHA1 証明書フィンガープリント」と「パッケージ名」を指定されたように登録しましょう。
*2
「作成」ボタンを押して、APIキーを作成します。
下記のように作成したAPIキーが確認できれば完了です。
iOSの場合
「iOS キー」を選択します。
下記のような画面が表示されるので、アクセスを許可するアプリの登録を行います。
事前に用意しておいた、「バンドルID」を指定されたように登録しましょう。
「作成」ボタンを押して、APIキーを作成します。
(ボタンが「更新」となっているのは気にしないでください。スクショ撮り忘れました。)
下記のように作成したAPIキーが確認できれば完了です。
Xamarin.Froms でビューをアニメーションさせる
ビューにはアニメーション用のメソッドが用意されています。 これを使用することで簡単にアニメーションを設定することができます。
今回は"BoxView"を使用してアニメーションを設定します。
サンプルはこちら
アニメーション用のメソッド
アニメーション用のメソッドには以下のものが用意されています。
- FadeTo
- LayoutTo
- RotateTo
- RotateXTo
- RotateYTo
- RelRotatoTo
- ScaleTo
- RelScaleTo
- TranslateTo
移動アニメーションの設定
ビューに移動アニメーションを設定するには、"TranslateTo"または"LayoutTo"メソッドを使用します。
"LayouTo"メソッドはビューのレイアウトを変更するためのメソッドですが、
ビューのサイズを変更せずに、ビューの位置だけを変更することで、
移動アニメーションを実現できます。
Xamarin.Formsでビューに移動アニメーションを設定する
スケールアニメーションの設定
ビューに拡大縮小アニメーションを設定するには"ScaleTo"または"RelScaleTo"メソッドを使用します。
"Rel"メソッドについては後ほど説明します。
Xamarin.Formsでビューに拡大縮小アニメーションを設定する
回転アニメーションの設定
ビューに回転アニメーションを設定するには"RotateTo"系メソッドを使用します。
Xamarin.Formsでビューに回転アニメーションを設定する
Relアニメーションについて
Relアニメーションは現在の状態に単純にパラメータを加算させたアニメーションを実行します。
上記の回転アニメーションのサンプルコードでは、現在の状態から30度回転させるアニメーションになります。
- RotateTo : ベースのビューを30度回転させた位置へのアニメーション 30度回転した状態になると、以降アニメーションしない
- RelRotateTo : ビューを現在の角度から30度回転させる
30度回転した状態になっても、アニメーションを指定するたびに、30度ずつ回転する
30度→60度→90度・・・
Xamarin.Forms の画像レイアウトを確認する
Xamarin.Formsで画像を表示する場合のレイアウトについて確認しました。
サンプルはこちら
Xamarin.Formsで画像を表示するには、2点設定する必要があります。
- 画像の表示アスペクトを設定する
- 表示領域を設定する
画像の表示アスペクトを設定する
アスペクトには3つの種類があります。
- AspectFit
- AspectFill
- Fill
AspectFit
アスペクトを維持したまま、表示領域にきっちり収まるサイズで表示します。 表示領域が余る場合は空白スペースになります。
AspectFill
アスペクトを維持したまま、表示領域全体を画像で満たすように表示します。 画像と表示領域のサイズによっては、画像が切れて表示されます。
Fill
アスペクトを無視し、表示領域全体を満たすように表示します。
画像の表示領域を設定する
Xamarin.Formsのレイアウトを使用して、画像の表示領域を決めます。 http://developer.xamarin.com/guides/cross-platform/xamarin-forms/controls/layouts/
*StackLayoutやGridでレイアウトのサイズを指定しなかった場合、 画像そのままのサイズで画像が表示されます。
画像をそのまま表示する
Xamarin.Forms でサイズを指定せずに画像を表示する
サイズの指定を行わない場合、アスペクトの設定に関わらず、 どれも同じに表示になることがわかります。
サイズを変更してAspect設定の違いを確認する
全体のレイアウトを横幅いっぱいにするようにしました。 表示領域を設定した場合、アスペクトの設定による表示の違いが生じることがわかります。 今回はレイアウトの配置設定を変更し、画面幅いっぱいに表示するようにしています。
配置設定について
配置設定は"LayoutOptions"を使用します。 "LayoutOptions"には8つのタイプがあります。
- Start
- Center
- End
- Fill
- StartAndExpand
- CenterAndExpand
- EndAndExpand
- FillAndExpand
Expandがついているものに関しては画面いっぱいの表示になりそうな気がしますが、 実際はしてくれません。 画面いっぱいの表示になるのは"Fill"と"FillAndExpand"のみです。 注意してください。 設定の仕方が悪いだけなのでしょうか?
Peppar開発環境の設定
Pepparの開発には「Coregraph(コレグラフ)」というSDKを使用します。 以下、開発環境設定の流れをまとめています。
アカウント登録
アルデバラン社のHPにアクセスします。
https://community.aldebaran.com/ja
「Sign in」「Create an account」を選択します。
必要項目を入力してアカウントを作成します。
登録したアドレスにメールが届くのでログインします。
デベロッパープログラムの登録
アルデバランにログインし、「Community」ページにアクセスします。
「Developers」から「今すぐ登録する」を選択します。
必要事項を入力して登録を完了します。
登録したアドレスに「ライセンスキー」が表示されたメールが届きます。
「ライセンスキー」を保存しておきましょう。
SDKのインストール
アルデバランにログインし、「Community」ページにアクセスします。
「リソース」から「ソフトウェア」を選択します。
環境に合わせてソフトウェアをダウンロードします。
ダウンロードしたパッケージを展開して、指示にしたがってインストールします。
インストールが完了したら、「コレグラフ」を立ちあげましょう。
ライセンスを取得していれば、ライセンスを入力しましょう。
無事に立ち上がれば完了です。