在 MapView 中重新定位 Google 徽标

Posted

技术标签:

【中文标题】在 MapView 中重新定位 Google 徽标【英文标题】:Relocate Google logo in MapView 【发布时间】:2011-10-18 21:41:55 【问题描述】:

MapView 的每个底角都有两个按钮,部分遮挡了左下角的 google 徽标。

为了遵守 API 的条款和条件,我需要将 google 徽标重新定位到更显眼的位置。即在按钮上方。

google API 文档指出 google 徽标是在 MapViewonDraw() 方法中绘制的,但我不知道如何正确覆盖它,因为 google maps 是封闭源代码。

我可以通过在MKMapView's 子项中找到正确的UIView 在 iPhone 中执行此操作,但我不知道如何在 android 中执行此操作。

【问题讨论】:

re:赏金,至少需要在 2.2 上工作,但与新版本的兼容性也很重要。 仅供参考 ***.com/questions/1968399/… 请参阅 AtomicCharles 答案。 【参考方案1】:

适用于 Android 的 Google Maps SDK v2 添加了此功能。

使用GoogleMap.setPadding() 为“活动”区域(包括 Google 徽标和版权声明)添加填充,同时仍填充整个容器。

https://developers.google.com/maps/documentation/android/map#map_padding

【讨论】:

这很奏效!当单击标记时,我需要一个面板向上滑动,并在地图上调用 setPadding 并传入面板的计算高度,将控件和徽标移动到面板上方。地图也会自动以点击的标记为中心,这很好。 有人知道在 V1 API 中是否可行? @lujop 没有同样的事情在 v1 中是不可能的 是一个很好的答案,但相机中心的填充也会受到影响【参考方案2】:

您可以在分配给它的标签GoogleWatermark 的帮助下移动谷歌徽标。在下面的代码中,我已将其移至屏幕的右上角。

View googleLogo = binding.missionMap.findViewWithTag("GoogleWatermark");
RelativeLayout.LayoutParams glLayoutParams = (RelativeLayout.LayoutParams)googleLogo.getLayoutParams();
glLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 0);
glLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 0);
glLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_START, 0);
glLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
glLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
googleLogo.setLayoutParams(glLayoutParams);

其中missionMap 是添加了MapFragment 的框架布局。

【讨论】:

很高兴知道它被标记为“GoogleWatermark”,谢谢。【参考方案3】:

我遇到了同样的问题,但您可以在不违反 Google 条款和条件的情况下实现您的目标。主要是把你的mapView放在Frame布局中,比如:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_
 android:layout_     
 android:orientation="vertical" >          

 <FrameLayout android:id="@+id/map_frame"
      android:layout_
      android:layout_
      android:layout_weight="0.7" >     

    <com.google.android.maps.MapView
        android:id="@+id/map_view" 
        android:layout_
        android:layout_ 
        android:enabled="true" 
        android:clickable="true"             
        android:apiKey="mySecretMapsApiKey"/>

 </FrameLayout>

 <ws.mentis.android.guardian.ui.MapNavBar
    android:id="@+id/map_nav"
    android:layout_
    android:layout_
    android:layout_gravity="bottom"
    android:layout_weight="0.3" /> 

 </LinearLayout>

我有许多按钮要包括在内,因此我在自定义小部件 (MapNavBar) 中创建了它们。 正如您从屏幕截图中看到的那样,Google 徽标仍然可见,并且在新窗口中的正常位置。

这适用于 Android 2.2 它还有一个好处是标准缩放控件也会向上移动,因此不会干扰您自己的按钮。

【讨论】:

是的,你可以这样做,但这不是我在问题中要求的布局:) 但它仍然为您提供了实现您想要的最终结果的方法。 功能上,是的。视觉上,不是。 感谢您的回答,但这不是我想要/要求的:) 这个主意不错,很棒【参考方案4】:

来自文档:

protected final void onDraw(android.graphics.Canvas canvas)

onDraw 是最终方法。 这根本不能被覆盖。

您也可以在与父底部对齐的布局中在地图视图下方显示您的按钮。这样您就可以在自己喜欢的位置放置按钮,而且不会遮挡您的 google 徽标。

【讨论】:

我实际上从未注意到 final 关键字。原来我想做的事是不可能的:( 烦人的问题,对于 ABS,带有叠加功能的拆分操作栏将覆盖徽标,从而使条款失效。所以叠加功能在这里不是一个选项。谷歌自己使用他们的地图应用程序做一些事情,以便将徽标移动到分割的叠加层上方。【参考方案5】:

确实是老问题,但也许有人会利用它。我让它出现在右上角:

Rect rect = new Rect()
mMapView.getLocalVisibleRect(rect)
googleMap.setPadding(rect.width() - 100, 0, 0, rect.height() - 50)

如果你想把它放在其他地方,你需要使用 setPadding 来获得乐趣

别忘了隐藏谷歌地图的 UI 按钮:

googleMap.getUiSettings().setMapToolbarEnabled(false)
googleMap.getUiSettings().setZoomControlsEnabled(false)
googleMap.getUiSettings().setMyLocationButtonEnabled(false)

有一个(至少)问题。 当使用相机在给定点上将地图居中时,将无法正常工作。如果需要移动相机,最好将填充设置为可见的地图片段,它应该可以正常工作。使用 rect 知道要放入setPadding的维度

【讨论】:

【参考方案6】:

我通过执行以下操作实现了这一点。

<RelativeLayout
  android:layout_
  android:layout_
  android:layout_marginBottom="-30dp"
  android:layout_marginTop="-30dp">

   <fragment
      android:id="@+id/map_frag_main"
      android:name="com.google.android.gms.maps.SupportMapFragment"
      android:layout_
      android:layout_
      tools:context=".MainActivity" />

</RelativeLayout>

这将剪掉 Google 徽标,无需填充,只需确保添加可绘制对象,否则将违反 TOS。

【讨论】:

错误。您也可以直接为片段设置边距。这取决于你。【参考方案7】:

有点小技巧,但您可以尝试将 MapView 添加到 FrameLayout, 设置 MapView X dp 大于 FrameLayout 的高度,以便将其剪掉,并添加徽标 @ 987654325@ 随心所欲。

【讨论】:

【参考方案8】:

您无需执行任何操作,只需按照 google maps 文档中的说明在 GoogleMap 对象上使用填充 注意:根据 Google Maps Platform 服务条款,您的应用程序不得删除或掩盖 Google 徽标或版权声明。地图填充允许您在必要时重新定位这些元素。如果您在地图底部显示自定义 UI,请在地图底部添加内边距,以便始终可见徽标和法律声明。

【讨论】:

以上是关于在 MapView 中重新定位 Google 徽标的主要内容,如果未能解决你的问题,请参考以下文章

Android中百度地图如何重新获取坐标

didUpdateUserLocation 未在重新加载视图时调用

MapView MyLocationOverlay 首次运行问题

Google Maps API v3 将地图重新​​定位到标记

Android Google Map Marker 未正确重新定位

ViewController 作为 Swift 中 MapView 的叠加层(如 Google 地图应用程序用户界面)