在MapView中显示地图标记上方的弹出窗口

22

我真不敢相信没有简单的方法可以做到像这样基础的事情...我想在用户点击地图标记后(类似于Google Maps应用程序中的效果)显示一个弹出框/气泡(一个LinearLayout)。当用户滚动地图时,它应该随着地图移动。如何最好地实现这一点?

一个想法是在我的Activity的根布局中放置LinearLayout,并在需要时显示它。但如何使它随地图移动?

另一种方法可能是创建一个覆盖层,通过onDraw绘制LinearLayout并提供布局触摸事件。这可行吗?

2个回答

46
我所做的方式是:
通过子类化 ItemizedOverlay,在需要的 GeoPoints 上放置标记,如 http://developer.android.com/guide/tutorials/views/hello-mapview.html 中所述。
通过从布局中膨胀来创建弹出视图:
View popUp = getLayoutInflater().inflate(R.layout.map_popup, map, false);
使用MapView.LayoutParams在ItemizedOverlay::onTap方法中,根据GeoPoint定位弹出窗口。当用户滚动地图时,弹出窗口会自动滚动(无需任何额外的代码)。基本上,弹出窗口会绑定到一个GeoPoint,如果用户缩放地图,弹出窗口的位置会自动调整。
MapView map = (MapView) findViewById(R.id.mapview);   
MapView.LayoutParams mapParams = new MapView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 
                        ViewGroup.LayoutParams.WRAP_CONTENT,
                        <geopoint>,
                        <x offset if required>,
                        <y offset like pinHeight>,
                        MapView.LayoutParams.BOTTOM_CENTER);
map.addView(popUp, mapParams);

当我添加弹出视图时,什么也没有发生。它没有出现?你遇到过这种情况吗? - Andreas Rudolph
搞定了!记住孩子们,总是在你的弹出视图的顶层视图组中放置另一个视图!因为那个视图组(你需要在其中放置内容的根视图)将从mapParams获取layoutparams。也许这个评论将有一天帮助某个人。 - Andreas Rudolph
@OneManMobile,如果我能理解这个评论,它可能会对我有所帮助。也许您可以查看我的问题,告诉我在您的popUp视图的顶部视图组中另一个视图具体是什么? - birgit

12

不是理想的解决方案(我正在使用的)是将弹出窗口放在地图上面的根RelativeLayout内,并在用户滚动地图时更改其位置。这不是理想的,因为弹出窗口的移动速度不会与地图相同 - 当我移动地图时,它会滞后于地图一段时间。当我有时间时,我会尝试手动在自定义覆盖层中绘制弹出窗口布局。 - fhucho
你在使用的是 Kiran 的解决方案吗? - OneWorld
你的解决方案听起来像是一个权宜之计。我也考虑过在第一个标记上方创建一个次要标记。但是越想,我意识到这样做并不是一个好办法。顺便说一下,我们正在讨论同一个问题:https://dev59.com/cG865IYBdhLWcg3wTczh 我们可以随时合并我们的问题。 - OneWorld
嗨,为什么它无法识别BalloonItemizedOverlay<OverlayItem>?我正在使用API级别8,这是问题所在吗? - Noby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接