2013-07-04 64 views
1

我正在使用google map api v2。我將地圖上的標記放在地圖上長按,當我拖拽到位於地圖左側的android「ic_delete」可繪製邊界上時(我們在啓動器中刪除應用程序時完成),我想刪除它們。幫幫我 !刪除地圖標記,同時拖動ImageView邊界

該處是我的代碼:

map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); 
    markers = new ArrayList<Marker>(); 
    boolean mReturn = false; 
    if (map != null) { 
     map.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
     mapSettings = map.getUiSettings(); 
     mapSettings.setCompassEnabled(true); 
     mapSettings.setRotateGesturesEnabled(true); 
     mapSettings.setZoomControlsEnabled(true); 
     map.setMyLocationEnabled(true); 


     map.setOnMapLongClickListener(this); 
     map.setOnMarkerDragListener(this); 
     mReturn = true; 
    } 


    @Override 
    public void onMapLongClick(LatLng position) { 
    // TODO Auto-generated method stub 

    final LatLng point = position; 

    Marker marker = map.addMarker(createMarkerOptions("test", "snippet", point, true)); 
    markers.add(marker); 

    // ... 
} 

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

} 

@Override 
public void onMarkerDragEnd(Marker marker) { 
    // TODO Auto-generated method stub 
    ImageView deleteMarker = (ImageView) findViewById(R.id.deleteMarker); 
    deleteMarker.setVisibility(View.GONE); 

     // I want to delete that "marker" if dragged over the "deleteMarker" imageview 

} 

@Override 
public void onMarkerDragStart(Marker marker) { 
    // TODO Auto-generated method stub 
    findViewById(R.id.deleteMarker).setVisibility(View.VISIBLE); 
} 
+0

這取決於您是否使用mapview,mapfragment或supportmapfragment。發佈你的代碼,這樣就不會受到影響。 – yams

+0

@MarkBasler我正在使用mapfragment。我已經發布了代碼! –

回答

0

問題部分得到解決,我試圖這樣:

LatLng markerLocation = marker.getPosition(); 
    LatLng mapCenter = map.getCameraPosition().target; 

Positionning在地圖上的中心的刪除圖標,我可以測試的緯度和經度屬性兩個以上的對象。

if((markerLocation.latitude > mapCenter.latitude - MINLAT && markerLocation.longitude > mapCenter.longitude - MINLNG) 
      && (markerLocation.latitude < mapCenter.latitude + MAXLAT && markerLocation.longitude < mapCenter.longitude + MAXLNG)){ 
     marker.remove(); 
    } 

編輯:

我的佈局:

<?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" 
android:orientation="vertical" > 

<fragment 
    android:id="@+id/map" 
    android:name="sn.gotech.trafficjammeu.TransparentSupportMapFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_alignParentTop="true"/> 

<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/ic_delete_marker" 
    android:layout_centerInParent="true" 
    android:contentDescription="@string/app_name" 
    android:visibility="gone" 
    android:padding="10dp" 
    android:id="@+id/deleteMarker" 
    /> 

OnMarkerDragListener overrided方法:

@Override 
public void onMarkerDragStart(Marker marker) { 
    // TODO Auto-generated method stub 
    deleteMarker.setVisibility(View.VISIBLE); 
    // .... 
} 

@Override 
public void onMarkerDragEnd(Marker marker) { 
    // TODO Auto-generated method stub 
    LatLng markerLocation = marker.getPosition(); 
    LatLng mapCenter = map.getCameraPosition().target; 

    float[] results = new float[1]; 
    Location.distanceBetween(markerLocation.latitude, 
      markerLocation.longitude, mapCenter.latitude, 
      mapCenter.longitude, results); 
    if (results[0]/1000 < RADIUS) // the RADIUS depends on Camera Zoom 
    { 
     // ... remove marker here 
    } 
    deleteMarker.setVisibility(View.GONE); 
} 
+0

嗨你的代碼和想法是一流的。我已經嘗試過,但我不知道如何獲得半徑 –

2

我認爲我對你發佈的答案有更好的看法。
我試圖做同樣的事情,我做的方式是將一個ImageView放置在活動的佈局中。
當您點擊標記時,手機會很快振動,如果將標記拖動到垃圾箱圖像上,圖像將變爲紅色。當標記位於垃圾桶頂部時,如果您停止拖動,標記將被移除,否則會回到其初始位置。
我的代碼是:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <fragment 
     android:id="@+id/customMapFragment" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     class="com.myapp.CustomMapFragment" /> 

    <ImageButton 
     android:id="@+id/ibDeleteMarker" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:layout_alignParentRight="true" 
     android:src="@drawable/ic_menu_delete" 
     android:layout_marginRight="8dp" 
     android:visibility="gone" /> 
</RelativeLayout> 

(宿刪除圖標在屏幕中間/右)

之後,我把我的標誌是draggable,我已經overidden的相應方法(設置後GoogleMap.OnMarkerDragListener)。我使用標記屏幕座標(實際的x,y不是lat,lng),並檢查它們是否重疊(以下代碼位於我的MapFragment中 - 在承載片段的活動中,我執行所需的findViewById等):

//This is in the activity 
    deleteMarker = (ImageButton) findViewById(R.id.ibDeleteMarker); 

    //This is in the MapFragment 
    vibrator = (Vibrator) activity.getSystemService(Context.VIBRATOR_SERVICE); 
//you need also the permission in AndroidManifest 
    @Override 
    public void onMarkerDragStart(Marker marker) { 
     ((MainActivity) getActivity()).deleteMarker.setVisibility(View.VISIBLE); 
     origMarkerPos = marker.getPosition(); 
     vibrator.vibrate(100); 
    } 

@Override 
public void onMarkerDrag(Marker marker) { 
    final ImageView deleteMarker = ((MainActivity) getActivity()).deleteMarker; 
    Point markerScreenPosition = getMap().getProjection().toScreenLocation(marker.getPosition()); 
    if (overlap(markerScreenPosition, deleteMarker)) { 
     deleteMarker.setImageResource(R.drawable.ic_menu_delete_red); 
    } else { 
     deleteMarker.setImageResource(R.drawable.ic_menu_delete); 
    } 
} 

@Override 
public void onMarkerDragEnd(Marker marker) { 
    final ImageView deleteMarker = ((MainActivity) getActivity()).deleteMarker; 
    deleteMarker.setVisibility(View.GONE); 
    Point markerScreenPosition = getMap().getProjection().toScreenLocation(marker.getPosition()); 
    if (overlap(markerScreenPosition, deleteMarker)) { 
     marker.remove(); 
    } else 
     marker.setPosition(origMarkerPos); 
} 

private boolean overlap(Point point, ImageView imgview) { 
    int[] imgCoords = new int[2]; 
    imgview.getLocationOnScreen(imgCoords); 
    Log.e(TAG, " ****** Img x:" + imgCoords[0] + " y:" + imgCoords[1] + " Point x:" + point.x + " y:" + point.y + " Width:" + imgview.getWidth() + " Height:" + imgview.getHeight()); 
    boolean overlapX = point.x < imgCoords[0] + imgview.getWidth() && point.x > imgCoords[0] - imgview.getWidth(); 
    boolean overlapY = point.y < imgCoords[1] + imgview.getHeight() && point.y > imgCoords[1] - imgview.getWidth(); 
    return overlapX && overlapY; 
} 

我不知道它是否是最好的解決方案,但它的工作原理。

注意:如果您有一個操作欄,標記的y座標和您必須考慮的imageview之間可能存在偏移。

+0

我做了同樣的事情。但是我將'ImageView'集中在主佈局中,並且使用'攝像頭位置'查找'地圖中心',並將其'緯度'和'經度'與拖動標記的緯度和經度比較。有了這個我管理標記抑制,但問題是,這個東西取決於'相機縮放',這就是爲什麼當你縮放+',刪除區域增加,當你縮放'',它減少。 –

+0

看看我的編輯 –

+0

請檢查更新的答案 –