Как реализовать перетаскивание для Android маркера?
Привет?
Я работаю над приложением MapView в Android. У меня есть три маркера, в которых я хочу использовать функцию getlocation Google Map API позже. Чтобы попробовать, я хотел бы переместить маркер с функцией перетаскивания и затем проверить местоположение.
Любой, кто получил перетаскивание, чтобы работать на маркером Android, или знал способ начать его выяснять?
/AK
Ответы
Ответ 1
Вот пример проекта из одна из моих книг показ перетаскивания маркеров на карте Google в Android.
В двух словах он использует onTouchEvent()
для обнаружения, когда пользователь прикасается и держит палец рядом с маркером. Затем он удаляет маркер с наложения, но накладывает то же изображение поверх карты с помощью RelativeLayout
. Затем, при событиях "перемещения" касания, изображение перемещается (быстрее, чем заставляя весь оверлей перерисовывать). Когда палец поднят, изображение будет удалено, но маркер будет помещен обратно в оверлей в новом месте.
Ответ 2
Внедрите API Android Google Maps v2, см. это: https://developers.google.com/maps/documentation/android/ и установите объект GoogleMap setOnMarkerDragListener. Для Ex:
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));
Ответ 3
Я нашел небольшую оптимизацию для функции CommonsWare drag and drop блестящей функции.
Я делал некоторые точные meashurements с маркерами на моей карте, и я хотел, чтобы мой маркер был точно на месте, я коснулся и поднял палец, чтобы мехображение было точно точным.
В оригинале CommonsWare, если вы касаетесь маркера рядом с маркером, маркер не переходит к этой точке, но движется вместе с движением пальца.
Мне нужно, чтобы маркер отображался чуть ниже моего пальца на ACTION_DOWN, ACTION_MOVE и ACTION_UP.
Вот код, если кому-то это нужно. Я должен поблагодарить CommonsWare за эту функцию, это действительно хорошая идея.
Это часть кода, который я модифицировал.
Мой MapView - 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 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);
}
С помощью этого вы получите стрелку, появляющуюся там, где вы нажимаете на нее, вместо стрелки, движущейся с того места, где она была.
Ответ 4
Здесь - полный код вывода Drag And Drop в Mapview в Android
Ответ 5
Для MapsV2. Используйте события карты Google. Не пишите свои собственные.
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) {
}
});