【问题标题】:Android Google Map Polygon click event [duplicate]Android谷歌地图多边形点击事件[重复]
【发布时间】:2013-08-29 00:08:02
【问题描述】:

我正在开发 Android 上的地图应用程序,我正在使用 Google Maps Android API V2。我从 Web 服务中获取多边形数据,通过 XML 解析对其进行转换,并可以毫无问题地将其显示在地图上。但是当用户触摸任何多边形时,没有任何方法可以像弹出窗口一样打开吗?或者,如果用户想要更改所选多边形的坐标。我看到了很多例子,但它们是用 javascript 或一些使用不同的第三方完成的。有人有什么建议吗?提前致谢。

【问题讨论】:

    标签: android google-maps coordinates polygon android-maps


    【解决方案1】:

    我遇到了同样的问题。用户点击多边形时不会调用 onMapClickListener,仅当其他叠加层(例如多边形)不处理点击事件时才会调用它。正如您所看到的,Polygon 确实会处理它 - GM 将多边形移动到屏幕中心。并且事件没有传递给onMapClickListener,就是这样。 为了解决这个问题,我在 GM 处理它们之前拦截点击事件,在视图包装 MapFragment 中,如 here 所述,将点击点从屏幕坐标投影到地图,然后检查它是否在地图上的多边形内,如 @987654322 所述@(其他答案也说明了这一点)

    相关代码:

    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>
    

    【讨论】:

      【解决方案2】:

      您只需要使用 onMapClickListener 即可返回新闻的纬度

      public abstract void onMapClick(LatLng 点)

      当用户在地图上做出点击手势时调用,但前提是地图的任何叠加层都没有处理该手势。此方法的实现总是在主线程上调用。 参数 点 地面上被点击的点(从屏幕点投影)。

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

      How to determine if a point is inside a 2D convex polygon?

      我有点拼凑起来,但好消息是 lat 和 lng 已经是双倍的。 祝你好运

      【讨论】:

      • 但是多边形不止一个,还有更多。那么我应该检查所有多边形的那个点吗?
      • 而且,使用这种方法,你只能检查点是否在多边形内,对吧?您无法获取有关多边形的坐标或任何信息?
      猜你喜欢
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多