Android谷歌地图多边形点击事件

3

我正在为Android开发一款地图应用程序,使用的是Google Maps Android API V2。我从Web服务获取多边形数据,通过XML解析将其转换后可以在地图上显示,没有问题。但是,有没有办法在用户触摸任何多边形时打开类似弹出窗口的东西呢?或者,如果用户想改变所选多边形的坐标怎么办?我看到了很多例子,但它们都是用JavaScript完成的,或者使用不同的第三方工具。有没有人有什么建议?谢谢。

2个回答

1
我遇到了相同的问题。当用户点击多边形时,onMapClickListener不会被调用,它只会在其他覆盖层(例如多边形)未处理触摸事件时被调用。正如您所看到的,多边形确实进行了处理,GM将多边形移动到屏幕中心。事件也没有传递给onMapClickListener,就是这样。
为了解决这个问题,在包装MapFragment的View中拦截GM处理之前的触摸事件,如here所述,将点击点从屏幕坐标投影到地图上,然后检查是否像here所述那样在地图上的多边形内部(另一个答案也提到了这一点)。
相关代码:
public class MySupportMapFragment extends SupportMapFragment {
private View mOriginalContentView;
private TouchableWrapper mTouchView;
private BasicMapActivity mActivity;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mActivity = (BasicMapActivity) getActivity();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent,
        Bundle savedInstanceState) {
    mOriginalContentView = super.onCreateView(inflater, parent,
            savedInstanceState);
    mTouchView = new TouchableWrapper();
    mTouchView.addView(mOriginalContentView);
    return mTouchView;
}

@Override
public View getView() {
    return mOriginalContentView;
}

class TouchableWrapper extends FrameLayout {

    public TouchableWrapper() {
        super(mActivity);
    }

    @Override
  public boolean dispatchTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
          break;
      case MotionEvent.ACTION_UP: {
          int x = (int) event.getX();
          int y = (int) event.getY();
          mActivity.tapEvent(x,y);
          break;
      }
    }
    return super.dispatchTouchEvent(event);
  }
}

}

BasicMapActivity:

public void tapEvent(int x, int y) {
    Log.d(TAG,String.format("tap event x=%d y=%d",x,y));
    if(!isEditMode()) {
        Projection pp = mMap.getProjection();
        LatLng point = pp.fromScreenLocation(new Point(x, y));
        for (Shape ss : mPolygons) {
            if(ss.isPointInPolygon(point)) {
                ss.mMarkers.get(0).marker.showInfoWindow();
            }
        }
    }
}

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map);
}

布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<fragment
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="au.com.datalink.plugins.MySupportMapFragment" />

</RelativeLayout>

0

你所要处理的是onMapClickListener,它返回按下位置的经纬度。

public abstract void onMapClick (LatLng point)

当用户在地图上进行轻触手势时调用此方法,但仅当地图的覆盖层都未处理该手势时才调用。此方法的实现始终在主线程上调用。 参数 point 被轻触的地面上的点(从屏幕点投影而来)。

然后检查latlng是否在多边形内。

如何确定一个点是否在二维凸多边形内?

我有点拼凑出来了,但好消息是lat和lng已经是双精度浮点数了。 祝你好运!


但不只有一个多边形,还有更多。那么我应该检查所有多边形的那个点吗? - arenko
通过这种方法,您只能检查点是否在多边形内部,对吗?您无法获取多边形的坐标或任何信息,对吗? - arenko

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