studio - ¿Cómo se implementa un arrastrar y soltar para el marcador de Android?
marcador de llamadas apk (5)
Encontré una pequeña optimización para la brillante 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 toca "cerca" del marcador, el marcador no va a ese punto exacto, sino que se mueve junto con el movimiento del 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 hacer 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, x-p.x, y-p.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 tu flecha que aparece donde presionas con tu, en lugar de que la flecha se mueva desde donde estaba.
¿Hola? Estoy trabajando en una aplicación MapView en Android. Tengo tres marcadores en los que quiero poder utilizar la función getlocation-function de Google Map API, 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 haya tenido que arrastrar y soltar para trabajar en un marcador de Android, o que sepa cómo empezar a averiguarlo?
/ALASKA
Implementar Google Maps Android API v2, consulte esto: https://developers.google.com/maps/documentation/android/ y configúrelo en el objeto setOnMarkerDragListener de GoogleMap. 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. Utiliza los eventos de google map. 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) {
}
});
Aquí hay un proyecto de muestra de uno de mis libros que muestra el movimiento de arrastrar y soltar de marcadores en un mapa de Google en Android.
En pocas palabras, usa onTouchEvent()
para detectar cuándo el usuario toca y coloca su dedo cerca de un marcador. Luego elimina el marcador de la superposición, pero coloca la misma imagen en la parte superior del mapa usando RelativeLayout
. Luego, en los eventos táctiles de "movimiento", la imagen se mueve (más rápido que obligando a que toda la superposición se dibuje nuevamente). Cuando se levanta el dedo, se quita la imagen, pero el marcador se coloca nuevamente en la superposición en el nuevo punto.
Here está el código completo de arrastrar y soltar pin en Mapview en Android