2013-07-04 2 views
1

Я использую карту google api v2. Я помещаю маркеры на длинный клик на карте, я бы хотел их удалить, когда перетащил выделенные рамки 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; 

позиционировании значок удаления на карте центра, я могу проверить широту и долготу атрибуты два вышеуказанных объекта.

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

EDIT:

Мой макет:

<?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 перекрытая методы:

@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

привет, ваш код и идея превосходны. Я пробовал, но я не понимаю, как получить Radius –

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 маркера и изображением, которое вы должны будете принять во внимание.

+0

Я сделал то же самое. Но я сосредоточил «ImageView» в своем основном макете, и я использовал «положение камеры», чтобы найти «центр карты», и сравнить его «широту» и «долготу» с латером и длительностью маркера перетаскивания. С этим я управлял подавлением маркера, но проблема в том, что этот материал зависит от «zoom камеры», поэтому, когда вы увеличиваете + ', область удаления увеличивается, а при масштабировании - уменьшается. –

+0

посмотреть на мое редактирование –

+0

Проверьте обновленный ответ –

Смежные вопросы