2013-03-13 41 views
12

có cách nào để đặt longClickListsner trên điểm đánh dấu trên google maps v2 không? Tôi muốn người dùng nhấn lâu vào điểm đánh dấu và có một hộp thoại với các tùy chọn để xóa hoặc xem thông tin. Điều này có thể được thực hiện?Đặt LongClickListener trên bản đồ Điểm đánh dấu

Trả lời

11

Lớp đánh dấu không có LongClickListener. Mặc dù cách tiếp cận này là xa hoàn hảo ở đây là một ý tưởng về những gì bạn có thể làm.

Đặt trình nghe nhấp chuột dài cho đối tượng GoogleMap của bạn. Khi nhấp chuột dài, hãy kiểm tra xem vị trí được nhấp có đủ gần với bất kỳ điểm đánh dấu nào của bạn hay không. Để quyết định ngưỡng gần gũi này, bạn có thể sử dụng mức thu phóng bản đồ.

Đây là mã mẫu không tốt. Tôi đã không thử nó nhưng nó có thể phù hợp với nhu cầu của bạn.

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

Đó sẽ là một cách nhưng không đánh lừa bằng chứng bởi vì bạn có thể chọn một dấu hiệu bạn không muốn và bạn sẽ không biết cho đến khi bạn xóa nó – tyczj

+0

@tyczj Vâng, nó không phải là bằng chứng hôi. Tuy nhiên, ngay cả khi người đánh dấu có một người nghe, thì những sự sai lầm sẽ xảy ra khi họ quá gần. Imo, việc kiểm tra điểm đánh dấu gần nhất không mang lại thêm sự cố nào. Misclicks xảy ra anyway, bạn chỉ cần làm cho người dùng xác nhận hoạt động. – akaya

15

Tôi có một đề xuất khác.

Đầu tiên tôi làm điểm đánh dấu kéo:

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

Sau khi bạn có thể làm cho một setOnMarkerDragListener người nghe như thế này:

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 

      } 
     }); 

Và sau đó bạn có thể ghi đè mà bạn muốn (thường onMarkerDragStart để mô phỏng một lâu nhấp vào)

Hy vọng điều này sẽ giúp

+0

Tuyệt vời! :))) – whiteLT

+0

Tôi đã thử điều này nhưng vị trí thay đổi điểm đánh dấu của tôi chỉ khi nhấn. Tôi đã không bắt đầu kéo nó chỉ cần gõ vào nó và nó đã thay đổi. Tôi không muốn làm điều này. Bạn có thể gợi ý cho tôi bất kỳ cách nào khác không. –

+0

Tôi nghĩ là vì điểm đánh dấu được căn giữa tại điểm bạn chạm vào. Tôi không biết nếu có một giải pháp cho điều đó, xin lỗi. – ARP

3

ARP s trả lời là tốt, nhưng nó bị một hiệu ứng xấu xí: các điểm đánh dấu thay đổi khi bạn bắt đầu kéo và khi bạn hoàn thành các điểm đánh dấu vẫn còn ở một vị trí cao hơn bạn đang chỉ với ngón tay của bạn.

Có một cái nhìn để http://www.youtube.com/watch?v=RxAHHJD4nU8

5

Như ARP gợi ý, bạn có thể sử dụng OnMarkerDragListener để mô phỏng bấm dài. Trong trường hợp của tôi, tôi đang tạo ra cột mốc mới khi onMapLongClick() xảy ra, vì vậy tôi muốn làm một cái gì đó tương tự (nhưng không bằng nhau) mà

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

cách này, bạn sẽ loại bỏ các điểm đánh dấu mà trước đây trong bản đồ và tạo một vị trí khác ở cùng vị trí, với cùng một nội dung (bạn phải có Bản đồ hoặc Ghép nối để giữ thông tin từ các điểm đánh dấu bạn tạo).

Hy vọng giải pháp của tôi sẽ hữu ích.

1

akaya's answer không phải là một cách tiếp cận xấu, nhưng nếu bạn có com.google.maps.android:android-maps-utils:0.3+library included với dự án của bạn, bạn có thể chính xác về khoảng cách:

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

Đó là cách tiếp cận xấu, bạn cũng phải tôn trọng mức thu phóng bản đồ –

+0

Phóng to độc lập. http://googlemaps.github.io/android-maps-utils/javadoc/com/google/maps/android/SphericalUtil.html#computeDistanceBetween-LatLng-LatLng- – flowtron

0

Chỉ trong trường hợp ai đó có thể cần nó, tôi đã điều chỉnh một hàm logarit để tính toán ngưỡng gần gũi @akaya đã đề cập, trong đó hoạt động tốt với kiểu thu phóng giữa 5.0 và 18. đây là chức năng:

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

Hey Hãy nhìn vào đoạn mã này Tôi vừa dừng điểm đánh dấu khỏi bị kéo và sử dụng phát hiện nhấp chuột dài của 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); 
    } 
} 

Bạn có thể gọi người nghe như thế này!

map.setOnMarkerDragListener(new LinkMarkerLongClickListener(markers) { 
      @Override 
      public void onLongClickListener(Marker marker) { 
       ToastUtils.showToast(Mission1Activity.this, marker.getTitle()); 
      } 
     }); 
Các vấn đề liên quan