はじめよう!Metro スタイル アプリ開発
おひさしぶりです。6月にWindows 8 Release Previewが公開されました。また、開発環境のVisual Studio 2012 RCも公開されています。皆さんは、実際に使ってみましたか? Windows 8では、新しい種類のアプリ「Metro スタイル アプリ」が登場しました。
Metro スタイル アプリは、これまでのアプリと比べ、既定ではデバイスの画面全体に表示され、ひとつのアプリに専念して使えます。また、快適なタッチによる操作をサポートします。
さて、この連載ではこれまでにさまざまなBing Maps関連のAPI・SDKを紹介してきましたが、Windows 8 Release Previewに併せて、Metro スタイル アプリ向けのBing Maps SDKも新しく提供されました。さっそく、新しいSDKで、Metro スタイル アプリを開発してみましょう!(図1 )
図1 Windows 8 Metro スタイル アプリの開発
Metro スタイル アプリの地図アプリ開発の紹介となりますので、Metro スタイル アプリの開発全般については、デベロッパー センターのMetro スタイル アプリ開発 も参照してください。
開発環境の準備
開発は、Windows 8 Release Preview とVisual Studio 2012 RC で行います。まずは、最新の環境を準備してください。
無償で提供されているVisual Studio Expressをインストールする場合は、Metro スタイル アプリ開発用の、Visual
Studio Express 2012 RC for Windows 8 を選択します。早期リリースバージョンであるVisual Studio 2012 RCは、すべてのエディションが無償で使えます。
Bing Maps SDK
続いて Bing Maps SDK を準備しましょう。Metro スタイル アプリ向けのBing Maps SDKは、Windows 8 Release Previewの公開後、一足遅れて、Bing Maps SDK for Metro style apps (RP) が提供されています。
Bing Maps SDK for metro style appsのダウンロードおよびインストールは、Visual Studioの「ツール」メニューの「拡張機能と更新」から行えます(図2 ) 。Webサイトからダウンロードしてインストールもできます。
図2 Bing Maps SDKのダウンロードとインストール
インストール後、Visual Studioを再起動します。
Bing Maps Keyの取得
Bing Maps SDKの地図コントロールを使うには、これまでの連載と同じくBing Maps Key が必要です。Bing Maps Account Center に、サインインしてBing Maps Keyを取得します。はじめて使う場合は、アカウントの登録が必要です(図3 ) 。また、Metro スタイル アプリの利用規約(Terms of Use )は、これまでのBing Maps APIの利用規約とは別に用意されていますので注意してください。
図3 アカウントの登録
Bing Maps Keyは、メニューの「Create or view keys」から新しく作れます(図4 ) 。Application typeは、「 Metro style app (BETA)」を選びます。Submitボタンをクリックすると、新しくキーが生成され同じページにキーのリストが表示されます。
図4 Bing Maps Keyの作成
Metro スタイル アプリ プロジェクトの作成
それでは、Visual StudioでMetro スタイル アプリのプロジェクトを新規作成しましょう。Metro スタイル アプリは、C++、C#、Visual Basic、JavaScriptのどれでも開発できます。Bing Maps SDKを利用する場合も、どの言語でも開発できます。
今回は、C#・Visual Basicを使います。メニューの「ファイル」―「新しいプロジェクト」から、図5 のように「Windows Metro style」の「Blank App (XAML)」を選択して、プロジェクトを作成します。ここではアプリ名を「SampleMapApp」としました。
図5 プロジェクトの新規作成
Bing Maps SDKの参照
プロジェクトでBing Maps SDKを利用するため、プロジェクトからSDKを参照します。メニュー「プロジェクト」―「参照の追加」から、参照マネージャーを開きます。図6 のように、Windowsの拡張子にある「Bing Maps for C#, C++, or Visual Basic (RP)」をチェックします。また、C#とVisual Basicのプロジェクトの場合、「 Microsoft Visual C++ Runtime Package」も必要ですので、併せてチェックします。OKボタンをクリックして完了です。
図6 Bing Maps SDKとC++ランタイム パッケージの参照
構成の変更
続いて、メニュー「ビルド」―「構成マネージャー」から、構成マネージャーを開きます(図7 ) 。プラットフォームに「Any CPU」が選択されていると思いますが、このままではBing Maps SDKが使えません。作成するアプリのプラットフォームに合わせて、ARM・x64・x86のいずれかを選びます。DebugとReleaseの両方の構成を変更しておきましょう。
図7 構成の変更
以上で、地図アプリのためのプロジェクトができました。
地図の表示
それでは、地図を表示させてみましょう。
プロジェクト内のMainPage.xamlを開きます。XAMLの編集画面で、Pageタグに名前空間の宣言を追加します。
xmlns : bm = "using:Bing.Maps"
Gridタグの中に、次のようにMapコントロールを追加します。BING_MAPS_KEY の部分は、作成したBing Maps Keyの値に置き換えてください。
<bm:Map Credentials = " BING_MAPS_KEY " x:Name = "MyMap" ></bm:Map>
ここまでの内容は図8 のようになります。
図8 Mapコントロールの追加
ここまでを実行してみましょう。図9 のようにツールバーでローカルコンピューターを選択して、デバッグを開始します。
図9 デバッグの実行
アプリが起動して、画面全体に地図が表示されましたね。動作を確認したら、Visual Studioの画面に戻って、実行を停止します(メニュー「デバッグ」―「デバッグの停止」 ) 。
ここで、ローカルコンピューターのかわりにSimulatorを選択して実行すると、タブレットのシミュレーターで動作確認ができます(図10 ) 。右側にある各ボタンから、デバイスの解像度の変更や回転、経緯度の指定などが行えます。
図10 シミュレーターでのデバッグ
基本的な地図の操作
次は、基本的な地図の操作をしてみましょう。
MainPage.xaml.vb(C#の場合は、MainPage.xaml.cs)ファイルを、ソリューションエクスプローラーから開きます。ここに地図の基本的な操作を行うコードを書いていきます。
次のようコンストラクタを追加して、地図を操作するコードを書きます。コードでは、表示する地点の指定、ズームレベルの指定、地図の種類の指定、そして、プッシュピンの追加を行っています。
MainPage.xaml.vb ( Visual Basicの場合)
Sub New ()
InitializeComponent ()
MyMap . Center = New Location ( 35.71 , 139.8107 )
MyMap . ZoomLevel = 17.5
MyMap . MapType = MapType . Birdseye
Dim pin = New Bing . Maps . Pushpin
MapLayer . SetPosition ( pin , New Location ( 35.71 , 139.8107 ))
MyMap . Children . Add ( pin )
End Sub
C#の場合は、既に記述されているコンストラクタに追記します。
MainPage.xaml.cs ( C#の場合)
public MainPage ()
{
this . InitializeComponent ();
MyMap . Center = new Location ( 35.71 , 139.8107 );
MyMap . ZoomLevel = 17.5 ;
MyMap . MapType = MapType . Birdseye ;
var pin = new Bing . Maps . Pushpin ();
MapLayer . SetPosition ( pin , new Location ( 35.71 , 139.8107 ));
MyMap . Children . Add ( pin );
}
ここまでを実行すると、小さい東京スカイツリーが表示されます(図11 ) 。執筆時点で使われている航空写真(概観図)は、建設前のようですね。また、概観図の場合、日本語とアルファベットの地名の表記が混じっています。プッシュピンは、図のように丸いオブジェクトで表現されます。
図11 地図の基本的な操作
同じ内容をXAMLで記述すると次のようになります。
MainPage.xaml
<bm:Map Credentials = "BingMapsKey"
Name = "MyMap"
ZoomLevel = "17.5" >
<bm:Map.Center>
<bm:Location Latitude = "35.71" Longitude = "139.8107" />
</bm:Map.Center>
<bm:Map.Children>
<bm:Pushpin>
<bm:MapLayer.Position>
<bm:Location Latitude = "35.71" Longitude = "139.8107" />
</bm:MapLayer.Position>
</bm:Pushpin>
</bm:Map.Children>
</bm:Map>
ちなみに、C++のプロジェクトを選択した場合も同様にXAMLを記述して同じMetroスタイル アプリが作れます。
位置情報を使った地図の操作
デバイスのGPSなどのセンサーを利用して、位置情報を取得するプログラムを書いてみましょう。そして、取得した位置にプッシュピンを配置します。
アプリ マニフェストの編集
Metro スタイル アプリで位置情報を取得するには、あらかじめアプリ マニフェスト
ファイルを編集し、アプリが位置情報を取得する機能があることを記述しておく必要があります。
アプリ マニフェストは、プロジェクトに含まれているPackage.appxmanifestファイルに、Windowsストアで公開する際に使うロゴ画像や、アプリが必要としている機能などが記述されています。ソリューションエクスプローラーから選択して開くと、マニフェスト
デザイナーが開きます。
位置情報を取得する場合、「 機能」タブを開き、「 場所」をチェックします(図12 ) 。
図12 アプリ マニフェストの編集
位置情報の取得
Metro スタイル アプリでは、位置情報の取得にGeolocator クラスのGetGeopositionAsync メソッドを使います。経緯度は、結果のGeoposition オブジェクトのCoordinate.Latitude プロパティと
Coordinate.Longitude プロパティからわかります。
位置を取得するコードは次のようになります。次のDisplayPositionメソッドをコードに追加して、コンストラクタから呼び出すようにしてみましょう。基本的な操作で書いたコードはコメントアウトしておきます。
MainPage.xaml.vb ( Visual Basicの場合)
Private Geolocator As New Geolocator
Private Async Sub DisplayPosition ()
Try
Dim pos = Await Geolocator . GetGeopositionAsync
Dim loc = New Location ( pos . Coordinate . Latitude , pos . Coordinate . Longitude )
Dim pin = New Bing . Maps . Pushpin
AddHandler pin . Tapped ,
Async Sub ()
Dim dialog = New Windows . UI . Popups . MessageDialog (
"Country = " & pos . CivicAddress . Country )
Await dialog . ShowAsync ()
End Sub
MapLayer . SetPosition ( pin , loc )
MyMap . Children . Clear ()
MyMap . Children . Add ( pin )
MyMap . SetView ( loc , 15 )
Catch authEx As System . UnauthorizedAccessException
Catch ex As Exception
End Try
End Sub
MainPage.xaml.cs ( C#の場合)
private Geolocator Geolocator ;
private async void DisplayPosition ()
{
if ( Geolocator == null ) Geolocator = new Geolocator ();
try
{
var pos = await Geolocator . GetGeopositionAsync ();
var loc = new Location ( pos . Coordinate . Latitude , pos . Coordinate . Longitude );
var pin = new Bing . Maps . Pushpin ();
pin . Tapped += async ( sender , e ) =>
{
var dialog = new Windows . UI . Popups . MessageDialog (
"Country = " + pos . CivicAddress . Country );
await dialog . ShowAsync ();
};
MapLayer . SetPosition ( pin , loc );
MyMap . Children . Clear ();
MyMap . Children . Add ( pin );
MyMap . SetView ( loc , 15 );
}
catch ( System . UnauthorizedAccessException )
{
}
catch ( Exception )
{
}
}
はじめてアプリを実行すると、図13 のように位置情報の取得の許可を求められます。ここでユーザーがブロックすると例外が発生し、情報はもちろん取得できません。
図13 位置情報の取得の確認ダイアログ
上記のコードでは、プッシュピンをタップすると、取得した位置情報を使って、国情報の表示をするようにも書いています。
この例では、1回のみ位置情報を取得し地図を移動していますが、PositionChangedイベントを使って場所が変化するたびに地図を移動するようにも簡単にできます。
Visual Basicの場合
AddHandler Geolocator . PositionChanged ,
Async Sub ( s , e )
Await Me . Dispatcher . RunAsync (
Windows . UI . Core . CoreDispatcherPriority . Normal , New Windows . UI . Core . DispatchedHandler (
Sub ()
Dim loc = New Location ( e . Position . Coordinate . Latitude , e . Position . Coordinate . Longitude )
MyMap . SetView ( loc , 15 )
End Sub ))
End Sub
C#の場合
Geolocator . PositionChanged += async ( s , e ) =>
{
await this . Dispatcher . RunAsync (
Windows . UI . Core . CoreDispatcherPriority . Normal , new Windows . UI . Core . DispatchedHandler (
() =>
{
var loc = new Location ( e . Position . Coordinate . Latitude , e . Position . Coordinate . Longitude );
MyMap . SetView ( loc , 15 );
}));
};
アプリ バーの追加
Metro スタイル アプリでは、コンテンツを操作するコマンドを表示する方法のひとつとして、アプリ バー があります。Bing Maps SDKに直接かかわる内容ではありませんが、よりアプリらしくするため、アプリにアプリ バーを追加してみましょう。
図14 Windows 8の地図アプリのアプリ バー
アプリ バーは、コンテンツのコマンドをオンデマンドで表示するために使います。既定ではアプリ バーは非表示です。画面の下から上へスワイプ動作で表示します。マウス操作の場合、右クリックで表示します。
今回は、現在地を表示するボタンをアプリ バーに追加します。コマンドの動作は、作成済みのDisplayPositionメソッドを呼び出します。今回は1個のボタンだけですが、ボタンの配置は、タッチで操作しやすいよう両端に配置します。コマンドが少ない場合や、永続的なコマンドは、右側に配置するようガイドラインで決められています。詳しくは、Metro スタイル アプリのコマンド実行の設計 を参照するとよいでしょう。
それでは、アプリにアプリ バーを追加しましょう。XAMLのコードのPageタグの中に次のように記述します。Tappedイベントで作成済みのDisplayPositionメソッドを呼んでいます。
MainPage.xaml
<Page.BottomAppBar>
<AppBar Padding = "10,0,10,0" >
<Grid>
<Button HorizontalAlignment = "Right"
Tapped = "DisplayPosition"
Style = " { StaticResource HomeAppBarButtonStyle } " />
</Grid>
</AppBar>
</Page.BottomAppBar>
以上で、基本的なところは完了です。追加されたボタンをみてみると、Metro スタイル アプリらしい丸枠の家のアイコンになっています(図15 ) 。
図15 アプリ バーのボタン
これは定義済みのスタイルを利用しています。どこで定義されているかというと、プロジェクトのCommonフォルダーの中のStandardStyles.xamlです。この中のHomeAppBarButtonStyleを利用しました。ほかにも、基本的なボタンのスタイルが定義されています。
ただし、このままではアイコンとコマンド名がマッチしていませんので、自分でスタイルを用意しましょう。StandardStyles.xamlで定義されていないスタイルのアイコンも簡単に追加できます。Pageタグに次のような定義を追加します。
MainPage.xaml
<Page.Resources>
<Style x:Key = "LocationAppBarButtonStyle" TargetType = "Button"
BasedOn = "{StaticResource AppBarButtonStyle}" >
< Setter Property = "AutomationProperties.AutomationId" Value = "LocationAppBarButton" />
< Setter Property = "AutomationProperties.Name" Value = "現在地" />
< Setter Property = "Content" Value = "" />
</Style>
</Page.Resources>
Buttonタグは次のようにStyle部分を変更します。
<Button HorizontalAlignment = "Right"
Tapped = "DisplayPosition"
Style = " { StaticResource LocationAppBarButtonStyle } " />
ボタンは図16 のようになります。
図16 修正後のボタン
Windows 8では、Segoe UI Symbolフォントにボタンに使えそうなアイコンが定義されています。Windows 8のスタート画面を表示しているとき、「 charmap」と入力して文字コード表を起動してください。
図17 文字コード表
文字コード表で、イラストの確認ができます(図17 ) 。ステータスバーに表示される「U+E114」などの値を上記コードの「Value="」部分を「Value="」のように変更すると、そのアイコンのボタンに変更できます。
おわりに
今回は、ここまでです。いかがでしたか。Metro スタイル アプリでもこれまでと同様、簡単に地図アプリが開発できました。今回紹介した内容以外にも、次の機能なども使えます。
ルートや領域を示す、ポリライン・ポリゴンの表示
オリジナルの地図のタイル画像の表示
交通情報の表示
各プラットフォームで提供されているBing Maps SDKはそれぞれ少し異なっています。今回利用したC++・C#・Visual Basic用のMetro スタイル アプリの地図コントロールは、すべての機能が詰まっているわけではありません。執筆時点では、屋内の地図の表示などは対応していないようです。
簡単にBing Mapsの地図コントロールが使えたほか、Metro スタイル アプリ自身も、C#・Visual Basicを使っていれば、比較的 簡単に開発できたのではないでしょうか。ただし、アプリは、これまでのデスクトップアプリとは、見た目も仕組みも、まったく異なります。Windowsストアで公開するため、審査に通る必要もあります。Metro スタイル アプリのためのガイドラインが、デベロッパーセンター に公開されていますので、少しずつ読み進めると良いかもしれませんね。