Android 如何根据屏幕位置而不是地图位置定位信息窗口?

Android 如何根据屏幕位置而不是地图位置定位信息窗口?,android,google-maps-android-api-2,infowindow,Android,Google Maps Android Api 2,Infowindow,我的自定义信息窗口大于默认值。这意味着我必须在单击标记时降低地图的中心点,以便信息窗口将完全显示。问题是,由于我将地图位置向下移动了特定的纬度,当地图放大时,偏移量太大。相反,当我把镜头拉远时,它向下移动得不够。如何相对于屏幕高度定位信息窗口 屏幕的默认外观。X是infoWindow的锚 |-----| |-----| |--X--| |-----| |-----| 我想要的:(无论缩放级别如何) 我要做的是: 1.)不要在标记中创建/添加默认信息窗口 2.)而是将事件处理程序(OnMarke

我的自定义信息窗口大于默认值。这意味着我必须在单击标记时降低地图的中心点,以便信息窗口将完全显示。问题是,由于我将地图位置向下移动了特定的纬度,当地图放大时,偏移量太大。相反,当我把镜头拉远时,它向下移动得不够。如何相对于屏幕高度定位信息窗口

屏幕的默认外观。X是infoWindow的锚

|-----|
|-----|
|--X--|
|-----|
|-----|
我想要的:(无论缩放级别如何)

我要做的是:

1.)不要在标记中创建/添加默认信息窗口

2.)而是将事件处理程序(OnMarkerClickListener)添加到标记中

3.)在clickhander中,在希望信息窗口出现的位置“计算”

例如,获取

Projection projection = map.getProjection(); // get map projection
VisibleRegion vr = projection.getVisibleRegion(); //
使用vr,您可以获得屏幕的左下角坐标。在那个角落加上几点,你就可以打电话了

LatLng infoLL = projection.fromScreenLocation(Point infoPoint);
获取信息窗口显示位置的坐标

4.)动态创建一个“虚拟标记”(例如一个像素图像),以便使用上面计算的位置(infoLL)不可见该标记

5.)将您的InfoWindow数据添加到其中

6.)立即在其中调用showInfoWindow()


7.)作为一个选项,向其中添加OnInfo WindowClickListener,以在单击时删除虚拟标记,或延迟删除,以降低地图在标记上的中心点。很抱歉,您丢失了默认的信息窗口实现。不要担心你的自定义信息窗口会很容易地移植到这个方法。这是一件非常好的事情来处理
onMarkerClick
,因为现在你的信息窗口可以处理链接到外部内容的按钮,信息窗口在谷歌地图应用程序上所做的任何事情,比如导航按钮,都可以在onMarkerClick()上通过弹出窗口或对话框片段来完成

遵循以下步骤

  • 告诉地图您正在处理onMarkerClick<代码>mMap.setOnMarkerClickListener(此)
  • 将onMarkerClick(标记)覆盖到
  • 显示弹出窗口 或对话框片段
  • 移动地图,使您的标记位于屏幕底部。 计算新的纬度需要考虑缩放和北向。 会有帮助的<代码>mMap.moveCamera(CameraUpdateFactory.newLatLng(markers newlat newlon))
  • 返回false告诉android您的
    处理标记
  • 注意:对于要使用默认地图信息窗口的标记,onMarkerClick()返回true。

    InfoWindows地图上的静态位置 我知道这是一个老问题,有些问题已经解决了,但经过4-5个小时的研发工作,我终于在这个阶段上做了一些不同的事情

    在这个场景中,我使用片段而不是信息窗口,以提高可靠性

    首先点击下面的链接:)

    在这个Guist中,我添加了3个文件

    1)customeMapview..java

    这是自定义的mapview,在xml文件中使用它

    2)映射\u fragment.xml

    我只是把我的信息窗口放在地图下面 如果您想选择左侧和上方,您可以使用透视图设置框架布局。请确保android:clickable=“true”在框架布局处单击可取消底部贴图

    3) MapsFragment.java

    首先,在Markerclick上设置片段转换

    让我们在customMapview的mapview.setCustomEventListener中移动

    如果(相交){}

    隐藏customInfo窗口的主要基本代码

    您可以在底部设置界面

     //custome listner to fetch data from Custom map view because map does't allow  anu touch/click listner 
    public interface OnCustomEventListener {
        void onEvent(MotionEvent ev);}
    
    享受地图的自定义静态信息窗口
    如有任何问题或建议,请在下面的评论中告诉我

    我不确定是否完全理解此解决方案。信息窗口似乎不会出现在所选标记上;可能在它上面,或远高于它,尽管它正确居中。@Phiat这会起作用,但我很好奇,如果您试图移动地图,调用showinfowindow并在标记上方锚定一个infowindow,最后从onMarkerClick()返回false而不创建临时标记,这对用户来说是可行的。showinfowindow在文档中没有提到任何关于移动地图的内容,它肯定比下面我的解决方案和您的临时标记解决方案更简单。是的。我最终得到了我想要的结果,为每个缩放级别调整了不同数量的地图中心点。有点邋遢,但它符合我的要求。感谢你们的帮助和指导,你们都提供了有用的信息。这比其他解决方案更接近我所做的。尽管这两种方法都很有帮助。你能分享一些有用的演示或例子吗?你能分享一个完整的项目吗?我想在标记的右侧实现信息窗口。MapFragment中的TestFragment是什么?我无法使用此方法。您能进一步建议吗?
     //custome listner to fetch data from Custom map view because map does't allow  anu touch/click listner 
    public interface OnCustomEventListener {
        void onEvent(MotionEvent ev);}