【问题标题】:change the location of zoom buttons (+-) in Xamarin.Forms.Maps更改 Xamarin.Forms.Maps 中缩放按钮 (+-) 的位置
【发布时间】:2021-05-12 03:41:32
【问题描述】:

我想在Xamarin.Forms 中的map 上更改Zoom button controls (+)(-) 的位置。可能吗?

【问题讨论】:

  • 如果不使用自定义渲染器实现您自己的地图控件,我认为这是不可能的
  • 你是说要重新定位android平台谷歌地图的默认缩放控件吗?
  • 是的,你是对的Grace 我想将google map 的默认缩放控件重新定位为android 平台但在xamarin.forms.maps
  • @user3367428,抱歉回复晚了,我没有收到任何关于您回复的通知,我不确定默认缩放控件是否可以移动,但自定义缩放控件会解决您的问题,有帮助吗?

标签: c# xamarin.android xamarin.forms


【解决方案1】:

经过一番研究,我认为没有办法重新定位谷歌地图的默认缩放控件,但正如我们所说,您可以使用自定义渲染器创建自己的地图控件,这样您就可以自定义您的缩放控件,例如:

<Grid>
    <controls:MapWithMyZoomControl x:Name="map"
          HorizontalOptions="FillAndExpand"
          VerticalOptions="FillAndExpand" />

    <StackLayout Orientation="Vertical">
        <Button Text="Zoom In" Clicked="Zoom_In" />
        <Button Text="Zoom Out" Clicked="Zoom_Out" />
    </StackLayout>
</Grid>

MapWithMyZoomControl:

public class MapWithMyZoomControl : Map
{
    public ZoomState MyZoom
    {
        get { return (ZoomState)GetValue(MyZoomProperty); }
        set { SetValue(MyZoomProperty, value); }
    }

    public static readonly BindableProperty MyZoomProperty =
        BindableProperty.Create(
            propertyName: "MyZoom",
            returnType: typeof(ZoomState),
            declaringType: typeof(MapWithMyZoomControl),
            defaultValue: ZoomState.normal,
            propertyChanged: OnZoomPropertyChanged);

    public static void OnZoomPropertyChanged(BindableObject bindable, object oldValue, object newValue)
    {
    }

    public enum ZoomState
    {
        normal,
        zoomin,
        zoomout
    }
}

渲染器:

public class MapWithMyZoomControlRenderer : MapRenderer, IOnMapReadyCallback
{
    private GoogleMap map;

    public void OnMapReady(GoogleMap googleMap)
    {
        map = googleMap;

        map.UiSettings.ZoomControlsEnabled = false;
    }

    protected override void OnElementChanged(ElementChangedEventArgs<Map> e)
    {
        base.OnElementChanged(e);

        if (e.OldElement != null)
        {
            // Unsubscribe
        }

        if (e.NewElement != null)
        {
            var formsMap = (MapWithMyZoomControl)e.NewElement;

            ((MapView)Control).GetMapAsync(this);
        }
    }

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);
        var element = Element as MapWithMyZoomControl;
        if (e.PropertyName == "MyZoom" && map != null)
        {
            if (element.MyZoom == MapWithMyZoomControl.ZoomState.zoomin)
            {
                map.AnimateCamera(CameraUpdateFactory.ZoomIn());
            }
            else if (element.MyZoom == MapWithMyZoomControl.ZoomState.zoomout)
            {
                map.AnimateCamera(CameraUpdateFactory.ZoomOut());
            }
            element.MyZoom = MapWithMyZoomControl.ZoomState.normal;
        }
    }
}

不要忘记像这样在渲染器中添加程序集:

[assembly: ExportRenderer(typeof(MapWithMyZoomControl), typeof(MapWithMyZoomControlRenderer))]

现在您可以更改按钮样式和位置。

【讨论】:

    【解决方案2】:
    namespace WD.EMP.APP.Droid.Renderer {
        public class GEMapRenderer: MapRenderer {
            protected override void OnMapReady(Android.Gms.Maps.GoogleMap googleMap) {
                base.OnMapReady(googleMap);
                NativeMap.SetPadding(0, 0, 0, 500);
            }
        }
    }
    
    NativeMap.SetPadding(0,0,0,500 );  
    

    通过设置填充谷歌地图将解决您的问题,将NativeMap.SetPadding(0,0,0,500 ); 放在onmapready 函数的渲染器文件中

    【讨论】:

    • 只是为了确认,这是一个优雅的答案。 NativeMap.SetPadding 在 Xamarin.Android 上完美运行 - 谢谢!
    • 这是一个非常肮脏的解决方案,而且它不会让你改变其他元素的位置,比如“我的位置”控件。
    【解决方案3】:

    你可以只使用 padding 属性。

    <maps:Map
        Padding="0, 0, 0, 20">
    

    【讨论】:

      猜你喜欢
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 2023-01-30
      相关资源
      最近更新 更多