我正在开发 Android 上的地图应用程序,并且正在使用 Google Maps Android API V2。我从 Web 服务中获取多边形数据,通过 XML 解析对其进行转换,并可以毫无问题地将其显示在地图上。但是当用户触摸任何多边形时,没有任何方法可以像弹出窗口一样打开吗?或者,如果用户想要更改所选多边形的坐标。我看到了很多例子,但它们是用 javascript 或一些使用不同的第三方完成的。有人有什么建议吗?提前致谢。
问问题
7721 次
2 回答
1
我有同样的问题。用户点击多边形时不会调用 onMapClickListener,仅当其他叠加层(例如多边形)不处理点击事件时才会调用它。正如您所看到的,Polygon 确实会处理它 - GM 将多边形移动到屏幕中心。并且事件没有传递给onMapClickListener,就是这样。为了解决这个问题,我在 GM 处理它们之前拦截点击事件,在 View wrapping MapFragment 中,如此处所述,将点击点从屏幕坐标投影到地图,然后检查它是否在地图上的多边形内,如此处所述(其他答案也讲述了它)
相关代码:
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);
}
}
}
基本地图活动:
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>
于 2013-09-05T11:08:33.327 回答
0
您只需要使用 onMapClickListener 即可返回印刷机的纬度
public abstract void onMapClick(LatLng 点)
当用户在地图上做出点击手势时调用,但前提是地图的叠加层都没有处理该手势。此方法的实现总是在主线程上调用。参数 point 地面上被点击的点(从屏幕点投影)。
然后检查 latlng 是否在多边形内。
我有点把这个拼凑起来,但好消息是 lat 和 lng 已经是双倍的。祝你好运
于 2013-08-26T22:05:14.317 回答