nuits.jp blog

C#, Xamarin, WPFを中心に書いています。Microsoft MVP for Visual Studio and Development Technologies。なお掲載内容は個人の見解であり、所属する企業を代表するものではありません。

Xamarin.Forms.GoogleMaps.Bindings 2.1.0の追加機能解説

昨日、Xamarin.Forms.GoogleMaps.Bindings 2.1.0のリリースを告知しましたが、あれだけだと不親切なので使い方が少し癖のある部分の解説を追記しておきます。

www.nuits.jp

追加した機能のうち、つぎの3つは少し使い方が特殊です。

  • Support MoveCamera
  • Support AnimateCamera
  • Support TakeSnapshot

とはいえ、どれか一つ覚えてしまえば基本的に他の機能も同じ方式に則っているので理解は容易でしょう。

というわけで、MoveCameraを例にとって説明します。

Mapの表示を位置や(三次元的な)角度を指定して、即座に変更するための機能がXamarin.Forms.GoogleMapsにはあります。
それをViewModelから利用するための機能を追加しました。

具体的にはViewModelに次のようなコードを追記します。

public MoveCameraRequest MoveCameraRequest { get; } = new MoveCameraRequest();

public Command MoveToTokyoCommand => new Command(() =>
{
    MoveCameraRequest.MoveCamera(CameraUpdateFactory.NewCameraPosition(
        new CameraPosition(
            new Position(35.681298, 139.766247), // Tokyo
            17d, // zoom
            45d, // bearing(rotation)
            60d // tilt
        ))); ;
});

MoveCameraRequestというプロパティを公開し、そのプロパティのMoveCameraメソッドを呼び出して利用します。
ちゃんと本家と同じく、Task<AnimationStatus>を返してくれます。
TakeSnapshotもちゃんとTask<Stream>を返してくれるため、投げっぱなしではなくちゃんとViewModel側で結果を受け取って処理できるようにしてあります。

もちろんこれだけではだめで、View側にBehaviorを追加して、このMoveCameraRequestからの要求を受け付けてMapへ伝達してあげる必要があります。

<googleMaps:Map>
    <googleMaps:Map.Behaviors>
        <bindings:MoveCameraBehavior Request="{Binding MoveCameraRequest}"/>
    </googleMaps:Map.Behaviors>
</googleMaps:Map>

こんな感じです。
簡単ですね。

つぎの機能にも簡単に触れておきましょうか。

  • Support InfoWindowClicked
  • Support InfoWindowLongClicked
  • Support MyLocationButtonClicked

これらにはMapのイベントを監視し、イベント発生時にイベントパラメーターを渡してCommandを発行するBehaviorとして追加しました。
今までも類似のものはありましたので説明は不要かもしれませんが。

具体的にはViewで次のように記述します。

<googleMaps:Map>
    <googleMaps:Map.Behaviors>
        <bindings:InfoWindowClickedToCommandBehavior Command="{Binding InfoWindowClickedCommand}"/>
        <bindings:InfoWindowLongClickedToCommandBehavior Command="{Binding InfoWindowLongClickedCommand}"/>
        <bindings:MyLocationButtonClickedToCommandBehavior Command="{Binding MyLocationButtonClicked}"/>
    </googleMaps:Map.Behaviors>
</googleMaps:Map>

特化型のEventToCommandBehaviorです。

てことで、簡単ですが今回はこれだけ。
それではまた!