Xamarin.Forms でプラットフォーム固有の機能を実装する(カスタムレンダラー編)

Xamarin.Formsでは各プラットフォーム固有の機能を使用する方法として、主に2つの方法があります。

  • カスタムレンダラー
  • DependencyService

カスタムレンダラーは、Xamarin.Formsの既存のビューを拡張する場合などに使用します。
ここでは、Xamarin.FormsのImageの色を変更する方法をカスタムレンダラーで実装します。

サンプルはこちら

github.com

手順

  • 共通プロジェクトにカスタム元のビューを用意する
  • 各プラットフォームにカスタム用のカスタムレンダラーを用意する
  • 共通プロジェクトにカスタマイズ用のパラメータを追加する
  • 各プラットフォームのカスタムレンダラーにカスタム内容を記述する

共通プロジェクトにカスタム元のビューを用意する

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のカラーが変更できるようになりました。

f:id:mattsuDev:20150713183735p:plain f:id:mattsuDev:20150713183747p:plain

Xamarin.Forms でComponentを追加する

Xamarin.FormsにはComponent Storeがあります。 そこから、コンポーネントを入手することで、各種処理の実装を簡単に行えるようになります。 ストアには有償のものも、無償のものもあります。

Google Maps コンポーネントiOSのプロジェクトに追加する方法を例にまとめます。

手順

Component Store にアクセスする

f:id:mattsuDev:20150709204510p:plain

  • 追加したいプロジェクト(今回はiOS)の「Components」フォルダにアクセスします。
  • 「オプション」画面を開いて「Get More Components」を選択します。
  • Xamarin Components のウィンドウが開きます。

コンポーネントを探す

f:id:mattsuDev:20150709205138p:plain

コンポーネントは左上の検索欄に入力することで、検索することができます。
目的のものが見つかったら選択して、次にいきます。

コンポーネントをプロジェクトに追加する

f:id:mattsuDev:20150709205439p:plain

コンポーネントの詳細ページの「Add to App」をボタンを選択することで、コンポーネントの追加が始まります。

追加されたコンポーネントを確認する

f:id:mattsuDev:20150709210150p:plain

追加が完了すると「Components」フォルダにコンポーネントが追加されます。
また、コンポーネントの使用方法や、サンプルが確認できる画面が表示されます。
必要に応じてサンプルなどをダウンロードしましょう。

以上で、コンポーネントの追加は完了です。

Xamarin.Forms でMapを表示する

Xamarin.FormsでMapを表示するには、"Xamarin.Forms.Maps"コントロールを使用します。
これを使用することで、iOSではApple Map、AndroidではGoogle Mapを容易に使用することができます。

サンプルはこちら

github.com

手順

  • "Xamarin.Forms.Maps"パッケージをプロジェクトに追加する
  • "Xamarin.Froms.Map"を初期化する
  • Map表示用のページを作成する
  • 各プロジェクトごとに必要な設定を行う

Xamarin.Forms.Maps パッケージをプロジェクトに追加

"Xamarin.Forms.Maps"を使用するには、プロジェクトにからパッケージを追加する必要があります。
パッケージは「NuGet」から取得することができます。

f:id:mattsuDev:20150705185117p:plain f:id:mattsuDev:20150705185134p:plain

  • PCLプロジェクトで、設定メニューを表示する。
  • 「追加」→「Add NuGet Packages...」と選択肢、NuGet追加の画面を表示する。
  • 「Official NuGet Gallery」を選択し、検索欄に「xamarin forms maps」と入力して検索する。
  • "Xamarin.Forms.Maps"パッケージをチェックボックスで選択し、「Add Package」で完了させる。

iOSAndroidの各プロジェクトで同様の操作を繰り返します。

完了すると、Mapの利用に必要なパッケージも同時に追加されます。

f:id:mattsuDev:20150705185548p:plain

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を表示するためのページを作成します。

Xamarin.Formsでマップを表示するためのページ

iOSの場合は、この段階でマップを表示することができます。 ビルドして確認してみましょう。 Androidの場合は、もう少し作業が必要なので次に進みましょう。

各プロジェクトごとの設定

Android

パーミッションの設定

AndroidでMapを使用するには3つのの権限が必要です。

  • AccessFineLocation
  • AccessNetworkState
  • Internet

f:id:mattsuDev:20150705185812p:plain

  • 「Properties」フォルダの「AndroidManifest.xml」を開きます。
  • 「Required permissions」内の上記項目をチェックすると完了です。

最大ヒープサイズの設定

ヒープの最大サイズを設定していない場合、コンパイルエラーになることがあります。

UNEXPECTED TOP-LEVEL ERROR: java.lang.OutOfMemoryError: Java heap space

f:id:mattsuDev:20150705190101p:plain

  • Androidプロジェクトのオプション画面を表示します。
  • 「ビルド」の「Android Build」を選択し、「Advanced」タブを開きます。
  • 「Additional Options」の「Java heap size:」に「1G」と設定しましょう。

これで、このエラーは解決します。

アプリケーションキーの設定

Androidでは、「Google Maps API v2」を使用します。
これを使用するには、「Google API」のキーを取得し、設定する必要があります。
取得方法については、別にまとめてあるのでそちらを参照してください。

mattsudev.hatenablog.com

取得したキーの設定を行います。

f:id:mattsuDev:20150705191617p:plain gist.github.com

  • 「Properties」フォルダの「AndroidManifest.xml」を開きます。
  • 「ソース」タブを選択します。
  • 「application」タグの間に上記のように「meta-data」タグを挿入します。
  • <取得したAPI Keyをここに書く>の部分にキーを入力して完了です。

iOS

iOSでは、マップを表示するだけなら特に権限は必要ありません。
しかし、現在地の表示などで位置情報を使用する場合は、位置情報使用のための権限を得る必要があります。

位置情報使用のための権限の取得

iOSで位置情報を使用するためには、2つのうちのどちらかの権限が必要です。
アプリに合わせて実装しましょう。

  • NSLocationAlwaysUsageDescription
    常に許可 (バックグラウンド時にも使用できます)
  • NSLocationWhenInUseUsageDescription
    このアプリ使用時のみに許可

「NSLocationAlwaysUsageDescription 」を設定する方法を例にあげます。

f:id:mattsuDev:20150705190602p:plain f:id:mattsuDev:20150705190618p:plain

  • 「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キーの作成方法をまとめました。

手順

  • 各プラットフォームでの準備
  • APIの有効化
  • APIキーの作成

Androidでの準備

SHA1 証明書フィンガープリントの取得

Google APIAPIキーを取得するには、
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 証明書フィンガープリントとなります。 後で使用するので、値をメモしておきましょう。

f:id:mattsuDev:20150706204843p:plain

パッケージ名の取得

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」を選択します。
自動的にプロジェクトが作成されます。

f:id:mattsuDev:20150706210351p:plain

APIの有効化

APIキーを使用するためには、使用したいAPIを有効化する必要があります。
「Enable Google APIs for use in your apps」を選択します。
f:id:mattsuDev:20150706211138p:plain

Androidなら「Google Maps Android API」を、
iOSなら「Google Maps SDK for iOS」を選択します。 f:id:mattsuDev:20150706211159p:plain

APIを有効にする」ボタンを押します。 f:id:mattsuDev:20150706211210p:plain

有効なAPIに追加されれば完了です。 f:id:mattsuDev:20150706211612p:plain

APIへアクセスするためのキーを作成

有効にしたAPIにアクセスするためのキーを作成します。
左側のメニューから「APIと認証」→「認証情報」と選択します。
「公開APIへのアクセス」の「新しいキー」を作成ボタンを押します。
「新しいキーの作成」ダイアログが表示されます。 f:id:mattsuDev:20150706212148p:plain

Androidの場合

Android key」を選択します。
下記のような画面が表示されるので、アクセスを許可するアプリの登録を行います。
事前に用意しておいた、「SHA1 証明書フィンガープリント」と「パッケージ名」を指定されたように登録しましょう。 *2
「作成」ボタンを押して、APIキーを作成します。 f:id:mattsuDev:20150706212848p:plain

下記のように作成したAPIキーが確認できれば完了です。 f:id:mattsuDev:20150706213921p:plain

iOSの場合

iOS キー」を選択します。
下記のような画面が表示されるので、アクセスを許可するアプリの登録を行います。
事前に用意しておいた、「バンドルID」を指定されたように登録しましょう。
「作成」ボタンを押して、APIキーを作成します。
(ボタンが「更新」となっているのは気にしないでください。スクショ撮り忘れました。) f:id:mattsuDev:20150706212913p:plain

下記のように作成したAPIキーが確認できれば完了です。 f:id:mattsuDev:20150706213949p:plain

*1:デバッグ用のキーストアです。リリース用のキーストアは自分で用意する必要があります。

*2:デバッグのみで接続する場合には、アプリの登録はなくても良いようです。

Xamarin.Froms でビューをアニメーションさせる

ビューにはアニメーション用のメソッドが用意されています。 これを使用することで簡単にアニメーションを設定することができます。

今回は"BoxView"を使用してアニメーションを設定します。

サンプルはこちら

github.com

アニメーション用のメソッド

アニメーション用のメソッドには以下のものが用意されています。

  • 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で画像を表示する場合のレイアウトについて確認しました。

サンプルはこちら

github.com

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 でサイズを指定せずに画像を表示する

サイズの指定を行わない場合、アスペクトの設定に関わらず、 どれも同じに表示になることがわかります。

f:id:mattsuDev:20150628184907p:plain

サイズを変更してAspect設定の違いを確認する

Xamarin.Formsで画面幅いっぱいにレイアウトする

全体のレイアウトを横幅いっぱいにするようにしました。 表示領域を設定した場合、アスペクトの設定による表示の違いが生じることがわかります。 今回はレイアウトの配置設定を変更し、画面幅いっぱいに表示するようにしています。

f:id:mattsuDev:20150628184932p:plain

配置設定について

配置設定は"LayoutOptions"を使用します。 "LayoutOptions"には8つのタイプがあります。

  • Start
  • Center
  • End
  • Fill
  • StartAndExpand
  • CenterAndExpand
  • EndAndExpand
  • FillAndExpand

Expandがついているものに関しては画面いっぱいの表示になりそうな気がしますが、 実際はしてくれません。 画面いっぱいの表示になるのは"Fill"と"FillAndExpand"のみです。 注意してください。 設定の仕方が悪いだけなのでしょうか?

Peppar開発環境の設定

Pepparの開発には「Coregraph(コレグラフ)」というSDKを使用します。 以下、開発環境設定の流れをまとめています。

  • ALDEBARAN(アルデバラン)のアカウント登録
  • デベロッパープログラムの登録(登録するとライセンスキーが発行されます。登録しなくても評価版が使用できます。)
  • SDKのインストール

アカウント登録

アルデバラン社のHPにアクセスします。
https://community.aldebaran.com/ja

「Sign in」「Create an account」を選択します。 f:id:mattsuDev:20150704110030p:plain

必要項目を入力してアカウントを作成します。

登録したアドレスにメールが届くのでログインします。

デベロッパープログラムの登録

アルデバランにログインし、「Community」ページにアクセスします。 「Developers」から「今すぐ登録する」を選択します。
f:id:mattsuDev:20150704111149p:plain

必要事項を入力して登録を完了します。

登録したアドレスに「ライセンスキー」が表示されたメールが届きます。
「ライセンスキー」を保存しておきましょう。

f:id:mattsuDev:20150918174428p:plain

SDKのインストール

アルデバランにログインし、「Community」ページにアクセスします。
「リソース」から「ソフトウェア」を選択します。
f:id:mattsuDev:20150704111122p:plain

環境に合わせてソフトウェアをダウンロードします。

ダウンロードしたパッケージを展開して、指示にしたがってインストールします。
f:id:mattsuDev:20150704111444p:plain

インストールが完了したら、「コレグラフ」を立ちあげましょう。
ライセンスを取得していれば、ライセンスを入力しましょう。
f:id:mattsuDev:20150704111653p:plain

無事に立ち上がれば完了です。
f:id:mattsuDev:20150704111717p:plain
f:id:mattsuDev:20150704111801p:plain