MapView добавляет pushpins на ощупь
Мне удалось отобразить карту на экране. Теперь пользователь перемещается по карте и нажимает на нее. После нажатия на точку мне нужно добавить нажимной контакт на экране в нажатом положении. Если пользователь решает перейти на другую точку, нажав на выбранную точку, первая кнопка будет исчезнет, а новый будет нарисован на новом месте.
Мне понравилось:
public class LocationSelectionActivity extends MapActivity
{
GeoPoint p;
List<Overlay> listOfOverlays;
MapOverlay mapOverlay;
private MapView mapView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.locationselection);
mapView = (MapView) findViewById(R.id.mapView);
mapView.setSatellite(false);
final MapController mc = mapView.getController();
String coordinates[] = {"46.540606", "22.454542"};
double lat = Double.parseDouble(coordinates[0]);
double lng = Double.parseDouble(coordinates[1]);
p = new GeoPoint(
(int) (lat * 1E6),
(int) (lng * 1E6));
mc.animateTo(p);
mc.setZoom(10);
ZoomControls zoomControls = (ZoomControls) findViewById(R.id.zoomcontrols);
zoomControls.setOnZoomInClickListener(new View.OnClickListener() {
public void onClick(View v) {
mc.zoomIn();
}
});
zoomControls.setOnZoomOutClickListener(new View.OnClickListener() {
public void onClick(View v) {
mc.zoomOut();
}
});
//---Add a location marker---
mapOverlay = new MapOverlay();
listOfOverlays = mapView.getOverlays();
listOfOverlays.clear();
listOfOverlays.add(mapOverlay);
mapView.invalidate();
}
class MapOverlay extends com.google.android.maps.Overlay
{
@Override
public boolean draw(Canvas canvas, MapView mapView,
boolean shadow, long when)
{
super.draw(canvas, mapView, shadow);
//---translate the GeoPoint to screen pixels---
Point screenPts = new Point();
mapView.getProjection().toPixels(p, screenPts);
//---add the marker---
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.map_flag);
canvas.drawBitmap(bmp, screenPts.x, screenPts.y-48, null);
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event, MapView mapView)
{
//---when user lifts his finger---
if (event.getAction() == 1) {
GeoPoint p = mapView.getProjection().fromPixels(
(int) event.getX(),
(int) event.getY());
Toast.makeText(getBaseContext(),
p.getLatitudeE6() / 1E6 + "," +
p.getLongitudeE6() /1E6 ,
Toast.LENGTH_SHORT).show();
}
return false;
}
}
Это вызывает исходную кнопку (ресурс map_flag). Когда вы нажимаете на карту, я получаю Toast с координатами... все остается сделать это на новом щелчке, стереть старый вывод и добавить новый.
Но как это сделать?
Ответы
Ответ 1
Я использовал бы ItemizedOverlay
, а не обычный Overlay
. Затем все, что вам нужно сделать, это обновить коллекцию объектов OverlayItem
и вызвать populate()
на ItemizedOverlay
.
Вот примерный проект, показывающий перетаскивание булавки с помощью ItemizedOverlay
.
Ответ 2
Этот код работает нормально.
@Override
public boolean onTap(GeoPoint p, MapView mapView) {
Log.d("tap event ", "tap called");
mapOverlays = mapView.getOverlays();
drawable =getResources().getDrawable(R.drawable.marker);
itemizedOverlay = new SitesOverlay(drawable);
int lat=(int)p.getLatitudeE6();
int lng=(int)p.getLongitudeE6();
GeoPoint point = new GeoPoint(lat,lng);
Log.d("tap event ", "tapcalled"+lat+""+lng);
OverlayItem overlayitem = new OverlayItem(point, "", "");
items.add(overlayitem);
populate();
Log.d("tap event ", "populated");
// mapOverlays.add(itemizedOverlay);
return true;
}
Ответ 3
@Override
public boolean onTouchEvent(MotionEvent event, MapView mapView)
{
//---when user lifts his finger---
if (event.getAction() == 1) {
p = mapView.getProjection().fromPixels(
(int) event.getX(),
(int) event.getY());
Toast.makeText(getBaseContext(),
p.getLatitudeE6() / 1E6 + "," +
p.getLongitudeE6() /1E6 ,
Toast.LENGTH_SHORT).show();
}
return false;
}
Это сработает. Сделать OnTouchEvent GeoPoint общедоступным...