¿Cómo se puede implementar arrastrando y soltando para marcador de Android?

¿Hola? Estoy trabajando en una aplicación MapView en Android. Tengo tres marcadores en los que quiero poder utilizar la función de ubicación de la API de Google Map, más adelante. Para probarlo, me gustaría mover el marcador con una función de arrastrar y soltar, y luego verificar la ubicación.

¿Alguien que ha tenido que arrastrar y soltar para trabajar en un marcador de Android, o sabe una manera de empezar a descubrirlo?

/ALASKA

Aquí hay un proyecto de muestra de uno de mis libros que muestra el movimiento de arrastrar y soltar marcadores en un mapa de Google en Android.

En pocas palabras, usa onTouchEvent() para detectar cuándo el usuario toca y mantiene el dedo cerca de un marcador. A continuación, elimina el marcador de la superposición, pero coloca la misma imagen sobre la parte superior del mapa mediante RelativeLayout . Luego, en eventos de “movimiento” táctil, la imagen se mueve (más rápido que forzar a que toda la plantilla vuelva a dibujarse). Cuando se levanta el dedo, la imagen se elimina, pero el marcador se vuelve a colocar en la superposición en el nuevo punto.

Implementar Google Maps Android API v2, consulte esto: https://developers.google.com/maps/documentation/android/ y establecer en el objeto GoogleMap setOnMarkerDragListener. Por ejemplo:

 map.setOnMarkerDragListener(new OnMarkerDragListener() { @Override public void onMarkerDragStart(Marker arg0) { // TODO Auto-generated method stub Log.d("System out", "onMarkerDragStart..."+arg0.getPosition().latitude+"..."+arg0.getPosition().longitude); } @SuppressWarnings("unchecked") @Override public void onMarkerDragEnd(Marker arg0) { // TODO Auto-generated method stub Log.d("System out", "onMarkerDragEnd..."+arg0.getPosition().latitude+"..."+arg0.getPosition().longitude); map.animateCamera(CameraUpdateFactory.newLatLng(arg0.getPosition())); } @Override public void onMarkerDrag(Marker arg0) { // TODO Auto-generated method stub Log.i("System out", "onMarkerDrag..."); } }); //Don't forget to Set draggable(true) to marker, if this not set marker does not drag. map.addMarker(new MarkerOptions().position(crntLocationLatLng).icon(BitmapDescriptorFactory .fromResource(R.drawable.icon_my_location)).draggable(true)); 

Para MapsV2. Usa los eventos del mapa de google. No escribas el tuyo

  mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() { @Override public void onMapClick(LatLng latLng) { mVisitingMarker.setPosition(latLng); mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng)); } }); mMap.setOnMarkerDragListener(new GoogleMap.OnMarkerDragListener() { @Override public void onMarkerDragStart(Marker arg0) { } @SuppressWarnings("unchecked") @Override public void onMarkerDragEnd(Marker arg0) { Log.d("System out", "onMarkerDragEnd..."); mMap.animateCamera(CameraUpdateFactory.newLatLng(arg0.getPosition())); } @Override public void onMarkerDrag(Marker arg0) { } }); 

Encontré una pequeña optimización para la shiny función de arrastrar y soltar de CommonsWare.

Estaba haciendo algunas mediciones precisas con marcadores en mi mapa, y quería que mi marcador estuviera exactamente en el lugar que toqué y levanté mi dedo para que la medición fuera exactamente precisa.

En el original de CommonsWare si tocas “cerca” del marcador, el marcador no irá a ese punto exacto, sino que se moverá junto con el movimiento de tu dedo. Necesitaba que el marcador apareciera justo debajo de mi dedo en ACTION_DOWN, ACTION_MOVE y ACTION_UP.

Aquí está el código si alguien lo necesita. Tengo que agradecer a CommonsWare para que haga esta función, es una muy buena idea.

Esta es la parte del código que modifiqué.

Mi MapView es mapa;

  @Override public boolean onTouchEvent(MotionEvent event, MapView mapView) { final int action=event.getAction(); final int x=(int)event.getX(); final int y=(int)event.getY(); boolean result=false; if (action==MotionEvent.ACTION_DOWN) { for (OverlayItem item : mOverlays) { Point p=new Point(0,0); mapa.getProjection().toPixels(item.getPoint(), p); //I maintain the hitTest's bounds so you can still //press near the marker if (hitTest(item, marker, xp.x, yp.y)) { result=true; inDrag=item; mOverlays.remove(inDrag); populate(); //Instead of using the DragImageOffSet and DragTouchOffSet //I use the x and y coordenates from the Point setDragImagePosition(x, y); dragImage.setVisibility(View.VISIBLE); break; } } } else if (action==MotionEvent.ACTION_MOVE && inDrag!=null) { setDragImagePosition(x, y); result=true; } else if (action==MotionEvent.ACTION_UP && inDrag!=null) { dragImage.setVisibility(View.GONE); //I get the geopoint without using any OffSet, directly with the //Point coordenates GeoPoint pt=mapa.getProjection().fromPixels(x,y); OverlayItem toDrop=new OverlayItem(pt, inDrag.getTitle(), inDrag.getSnippet()); orig = inDrag.getMarker(0); //In my case I had down heading Arrows as markers, so I wanted my //bounds to be at the center bottom toDrop.setMarker(boundCenterBottom(orig)); mOverlays.add(toDrop); populate(); inDrag=null; result=true; } return(result || super.onTouchEvent(event, mapView)); } private void setDragImagePosition(int x, int y) { RelativeLayout.LayoutParams lp= (RelativeLayout.LayoutParams)dragImage.getLayoutParams(); //Instead of using OffSet I use the Point coordenates. //I want my arrow to appear pointing to the point I am moving, so //I set the margins as the Point coordenates minus the Height and half the //width of my arrow. lp.setMargins(x-(dragImage.getWidth()/2),y-dragImage.getHeight(), 0, 0); dragImage.setLayoutParams(lp); } 

Con esto obtienes la flecha que aparece donde presionas con tu, en lugar de que la flecha se mueva desde donde estaba.

Aquí está el código completo del pin de arrastrar y soltar en Mapview en Android