【问题标题】:Google Map wrong marker clicked event when two markers are adjacent当两个标记相邻时,Google Map 错误的标记单击事件
【发布时间】:2018-06-10 22:16:09
【问题描述】:

我已经为标记应用了自定义 PNG 图像(与默认标记聚类器圆圈大小相同),并且发生了这种奇怪的事情。当两个标记接近时(但即使它们不重叠),我需要点击一个标记两次,因为第一次点击错误地给了我前一个标记。

也就是说,

  • 有两个标记 A 和 B 彼此靠近。
  • 我点击 A,然后我得到一个带有 A 的标记单击事件。
  • 然后,我点击 B,但我得到一个标记单击事件与 A。
  • 如果我再次按 B 键,那么我会收到一个带有 B 的标记单击事件。

为了重现这个问题,我创建了一个单独的项目并且没有更改标记图像。我将两个标记(“我的房子”和“车库”)彼此靠近放置,然后在模拟器中运行应用程序,然后使用鼠标单击准确的位置。我将鼠标放在“车库”标记的中心(黑点)并一直单击它而不移动鼠标。以下是日志。

[ 12-31 13:42:24.509 28921:28921 D/         ]
Garage is clicked

[ 12-31 13:42:25.664 28921:28921 D/         ]
My house is clicked

[ 12-31 13:42:26.819 28921:28921 D/         ]
Garage is clicked

[ 12-31 13:42:28.066 28921:28921 D/         ]
My house is clicked

[ 12-31 13:42:29.333 28921:28921 D/         ]
Garage is clicked

[ 12-31 13:42:30.503 28921:28921 D/         ]
My house is clicked

如您所见,即使我单击了完全相同的位置,标记事件的参数也一直在变化。这是一个错误吗?

主活动

class MainActivity : AppCompatActivity(), OnMapReadyCallback
{
    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val mapFragment = this.supportFragmentManager.findFragmentById(
                R.id.mapView) as SupportMapFragment;
        mapFragment.getMapAsync(this)
    }

    var mMap:GoogleMap? = null;

    override fun onMapReady(p0: GoogleMap?)
    {
        mMap = p0;

        var marker = MarkerOptions()
        marker.position(LatLng(51.501518, -0.141847));
        marker.title("My house");
        p0?.addMarker(marker);

        var marker2 = MarkerOptions()
        marker2.position(LatLng(51.501518, -0.142300));
        marker2.title("Garage");
        p0?.addMarker(marker2);

        p0?.setOnMarkerClickListener {
            marker ->
            Log.d("", marker.title + " is clicked")
            true;
        }
    }
}

XML

<fragment
    android:id="@+id/mapView"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="8dp"
    map:uiZoomControls="true"
    map:cameraTargetLat="51.501518"
    map:cameraTargetLng="-0.141847"
    map:cameraZoom="16"/>

PS:它似乎不必那么相邻。我尝试了这些值,但仍然发生。

    marker.position(LatLng(51.501518, -0.141847));
    marker2.position(LatLng(51.501518, -0.142500));

然后,我将两者进一步分开,直到,

    marker.position(LatLng(51.501518, -0.141847));
    marker2.position(LatLng(51.501518, -0.142800));

现在,单击中心(黑点)并没有重现问题。但是点击靠近另一个标记的制造商的偏离中心仍然会重现问题。

【问题讨论】:

  • 我建议几乎重叠的标记的底层可点击框实际上是重叠的。这可以解释为什么两个标记都可以从同一个位置到达。至于切换,我们可能需要查看地图源代码来解释。
  • 如果是这种情况,并且当标记相邻时我不应该处理单击事件,我如何知道单击事件中的标记是否相邻?我知道返回 false 会让 Google Maps 进行放大,但我必须先知道标记是否相邻,然后才能返回 false。其实前几天I had asked that可是没有人回答。我认为这是一个常见的要求。
  • 直接的解决方法是进一步放大。不好,但应该避免这种情况。关于你的另一个问题,现在大家都在放假。考虑为其他问题或这个问题添加大量赏金。
  • 很抱歉回复晚了。我不是在度假,但该死的廉价互联网已经停止服务,所以我无法连接到互联网。如果没有简单的内置方法来做到这一点,我想我必须为标记创建某种列表(纬度、经度)并计算距离以检查是否没有相邻的标记。
  • 我相信此问题已在 Google 问题跟踪器中报告:issuetracker.google.com/issues/62556358

标签: android google-maps google-maps-api-3


【解决方案1】:

在这里可以 100% 再现。我找到了一种解决方法,只需将反向 zIndex 设置为 MarkerOptions。

    for (int i = 0; i < locations.size(); i++) {
        Marker marker = mGoogleMap.addMarker(new MarkerOptions()
            .position(latLng)
            .zIndex(locations.size() - 1 - i) // this avoids the bug when the bottom marker is selected
        );
    }

【讨论】:

    猜你喜欢
    • 2017-03-09
    • 1970-01-01
    • 2014-11-29
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多