ぴーさんログ

だいたいXamarin.Formsのブログ

Effectを使ってAndroidのMapViewからボタンを消す

Xamarin.Forms.Maps.Map コントロールを使用する際に現在位置表示、ズーム機能をONにしていると、Android版では地図上にボタンが表示されます。(iOSでは表示されない)

f:id:ticktack623:20160205000621p:plain:w300

iOSと揃えたい、デザインが他と馴染まないので自前で用意したいという場合は邪魔になるので、Effectでネイティブコントロールに介入して消してしまいましょう。

Androidプロジェクト内に新しいEffectクラスを作ります。

using System;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using Android.Gms.Maps;

[assembly: ResolutionGroupName ("YourCompany")]
[assembly: ExportEffect (typeof (SuppressMapButton.Droid.SuppressMapButtonEffect), "SuppressMapButtonEffect")]

namespace SuppressMapButton.Droid
{
    public class SuppressMapButtonEffect : PlatformEffect
    {
       #region implemented abstract members of Effect
        protected override void OnAttached()
        {
            var mapView = Control as MapView;
            if(mapView == null)
                return;

            // ズームボタン LinearLayout
            var zoomButton = mapView.FindViewById(1);
            if(zoomButton != null)
            {
                zoomButton.Visibility = Android.Views.ViewStates.Gone;
            }
            
            // 現在位置ボタン ImageView
            var locationButton = mapView.FindViewById(2);
            if(locationButton != null)
            {
                locationButton.Visibility = Android.Views.ViewStates.Gone;
            }
        }

        protected override void OnDetached()
        {
        }
       #endregion
    }
}

2016年2月現在では Id:1 がズームボタン、 Id:2 が現在位置ボタンとなっていました。 値の根拠はmapViewStyleになると思うのですがソースを見つけられなかったので確認できてません。

使用する側はこんな感じ。

public App()
{
    MainPage = new ContentPage {
        Content = new Xamarin.Forms.Maps.Map
        {
            IsShowingUser = true,
            HasZoomEnabled = true,
            Effects = {
                Effect.Resolve("YourCompany.SuppressMapButtonEffect"),
            },
        },
    };
}

見事、地図上のボタンを消せました。

f:id:ticktack623:20160205000656p:plain:w300

参考

stackoverflow.com