2013-08-26 35 views
3

我正在研究Android上的地圖應用程序,並且我正在使用Google Maps Android API V2。我從Web服務獲取多邊形數據,通過XML解析將其轉換,並可以在地圖上顯示它,而不會出現問題。但是當用戶觸及任何多邊形時,沒有任何方法可以像彈出一樣打開?或者,如果用戶想要改變選定多邊形的座標。我看到很多例子,但是它們都是用javascript或者一些使用不同的第三方完成的。有人有任何建議嗎?提前致謝。Android Google Map Polygon click event

回答

0

所有你有是onMapClickListener返回新聞界的經緯度工作

公共抽象無效onMapClick(經緯度點)

當用戶在地圖上的點按手勢調用,但只有當沒有任何地圖的疊加處理該手勢。此方法的實現總是在主線程上調用。 參數 point點擊地面上的點(從屏幕點投影)。

然後檢查latlng是否在多邊形內。

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

我有點拼湊了一起,但好消息是緯度和經度已增加一倍。 祝你好運

+0

但是不僅有一個多邊形,還有更多。那麼我應該檢查所有多邊形的這個點嗎? – Rnklnc

+0

以及用這種方法,你只能檢查點是否在多邊形內,對不對?你不能獲得有關多邊形的座標或任何信息? – Rnklnc

1

我有同樣的問題。當用戶點擊一個多邊形時,onMapClickListener不會被調用,只有當其他覆蓋(如多邊形)不處理該點擊事件時纔會調用onMapClickListener。如您所見,Polygon會處理它 - GM將多邊形移動到屏幕中心。事件不會傳遞給onMapClickListener,就是這樣。 要解決這個問題,我在GM處理它們之前攔截點擊事件,在視圖中環繞MapFragment,如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>