在 MapView 中重新定位 Google 徽标
Posted
技术标签:
【中文标题】在 MapView 中重新定位 Google 徽标【英文标题】:Relocate Google logo in MapView 【发布时间】:2011-10-18 21:41:55 【问题描述】:MapView
的每个底角都有两个按钮,部分遮挡了左下角的 google 徽标。
为了遵守 API 的条款和条件,我需要将 google 徽标重新定位到更显眼的位置。即在按钮上方。
google API 文档指出 google 徽标是在 MapView
的 onDraw()
方法中绘制的,但我不知道如何正确覆盖它,因为 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 徽标的主要内容,如果未能解决你的问题,请参考以下文章
didUpdateUserLocation 未在重新加载视图时调用
MapView MyLocationOverlay 首次运行问题
Google Maps API v3 将地图重新定位到标记