2013-03-13 122 views

回答

11

標記類沒有LongClickListener。雖然這種方法遠非完美,但這是一個關於你能做什麼的想法。

爲您的GoogleMap對象設置一個長按監聽器。長按一下,檢查點擊位置是否足夠接近任何標記。要確定這個接近度閾值,您可以使用地圖縮放級別。

這裏是不太好的示例代碼。我沒有嘗試過,但它可能適合您的需求。

map.setOnMapLongClickListener(new OnMapLongClickListener() { 

      @Override 
      public void onMapLongClick(LatLng latLng) { 
       for(Marker marker : yourMarkerList) { 
        if(Math.abs(marker.getPosition().latitude - latLng.latitude) < 0.05 && Math.abs(marker.getPosition().longitude - latLng.longitude) < 0.05) { 
         Toast.makeText(MapActivity.this, "got clicked", Toast.LENGTH_SHORT).show(); //do some stuff 
         break; 
        } 
       } 

      } 
     }); 
+0

這將是一個辦法,但它不是愚弄證明,因爲你可以選擇你不想一個標記,你不會知道,直到你刪除它 – tyczj 2013-03-13 18:50:39

+0

@tyczj是的,這是不犯規的證據。儘管如此,即使標記具有聽衆,當它們太靠近時也會發生錯誤。伊莫,檢查最接近的標記不會帶來額外的問題。無論如何都會發生Misclicks,您只需要讓用戶確認操作即可。 – akaya 2013-03-14 08:05:59

15

我有另外一個提議。

首先我做出標記可拖動:

mapa.addMarker(new MarkerOptions() ...  
     .setDraggable(true); 

可以使聽者setOnMarkerDragListener這樣後:

mapa.setOnMarkerDragListener(new OnMarkerDragListener() { 

      @Override 
      public void onMarkerDragStart(Marker marker) { 
       // TODO Auto-generated method stub 
       //Here your code 
      } 

      @Override 
      public void onMarkerDragEnd(Marker marker) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void onMarkerDrag(Marker marker) { 
       // TODO Auto-generated method stub 

      } 
     }); 

然後你就可以越過你要(通常onMarkerDragStart模擬長點擊)

希望它有幫助

+0

優秀! :))) – whiteLT 2013-11-30 15:48:16

+0

我已經嘗試過,但我的標記更改位置只是在水龍頭上。我還沒有開始拖動它只是點擊它,它改變了。我不想這樣做。你能以其他方式暗示我嗎? – 2017-05-23 05:23:12

+0

我認爲是因爲標記集中在你觸摸的點上。我不知道是否有解決方案,對不起。 – ARP 2017-05-23 17:40:52

5

由於ARP建議,您可以使用OnMarkerDragListener模擬長按。就我而言,我創造新的標誌物onMapLongClick()時有發生,所以我想做類似(但不等於)的

@Override 
public void onMarkerDragStart(Marker marker) { 
    marker.remove(); 
    MarkerOptions options = createBasedOnMarker(marker); 
    this.googleMap.addMarker(options); 
} 

這樣一來,你就刪除了以前內的標誌的東西在相同的位置上創建另一個相同的內容(您必須有一個Map或Pair來保存您創建的標記的信息)。

希望我的解決方法有所幫助。

1

akaya's answer是個不錯的辦法,但如果你有com.google.maps.android:android-maps-utils:0.3+library included你的項目,你可以準確的對距離:

double distance = SphericalUtil.computeDistanceBetween( 
    marker.getPosition(), 
    latLng 
); 
if(distance < 50) { // closer than 50 meters? 
    //..do stuff.. 
} 
+0

這是壞方法,您還必須尊重地圖縮放級別 – 2017-02-13 08:04:27

+0

縮放無關。 http://googlemaps.github.io/android-maps-utils/javadoc/com/google/maps/android/SphericalUtil.html#computeDistanceBetween-LatLng-LatLng- – flowtron 2017-03-01 15:17:00

0

萬一有人需要它,我已經調整了對數函數來計算@akaya提到的接近閾值時,工作正常的5.0和18之間。在此變焦的功能是:

float zoom = mMap.getCameraPosition().zoom; 
double maxDistance = 2000000 * Math.exp(-0.644*zoom); 
2

嘿看看這段代碼,我剛剛停止了拖動標記,並使用onMarkerDragStart的長時間點擊檢測。

public abstract class LinkMarkerLongClickListener implements GoogleMap.OnMarkerDragListener { 

    private int previousIndex = -1; 

    private Marker cachedMarker = null; 
    private LatLng cachedDefaultPostion = null; 

    private List<Marker> markerList; 
    private List<LatLng> defaultPostions; 

    public LinkMarkerLongClickListener(List<Marker> markerList){ 
     this.markerList = new ArrayList<>(markerList); 
     defaultPostions = new ArrayList<>(markerList.size()); 
     for (Marker marker : markerList) { 
      defaultPostions.add(marker.getPosition()); 
      marker.setDraggable(true); 
     } 
    } 

    public abstract void onLongClickListener(Marker marker); 

    @Override 
    public void onMarkerDragStart(Marker marker) { 
     onLongClickListener(marker); 
     setDefaultPostion(markerList.indexOf(marker)); 
    } 

    @Override 
    public void onMarkerDrag(Marker marker) { 
     setDefaultPostion(markerList.indexOf(marker)); 
    } 

    @Override 
    public void onMarkerDragEnd(Marker marker) { 
     setDefaultPostion(markerList.indexOf(marker)); 
    } 


    private void setDefaultPostion(int markerIndex) { 
     if(previousIndex == -1 || previousIndex != markerIndex){ 
      cachedMarker = markerList.get(markerIndex); 
      cachedDefaultPostion = defaultPostions.get(markerIndex); 
      previousIndex = markerIndex; 
     } 
     cachedMarker.setPosition(cachedDefaultPostion); 
    } 
} 

你可以這樣稱呼聽衆!

map.setOnMarkerDragListener(new LinkMarkerLongClickListener(markers) { 
      @Override 
      public void onLongClickListener(Marker marker) { 
       ToastUtils.showToast(Mission1Activity.this, marker.getTitle()); 
      } 
     });