#android #google-maps
#Android #google-карты
Вопрос:
В моем приложении я показываю карту мира.
когда пользователь нажимает на определенное местоположение, я прикрепляю к нему маркер.
Однако, когда пользователь нажимает на другое местоположение, я хочу удалить предыдущий маркер и прикрепить его к новому местоположению.
Я проверил несколько сообщений, но не смог найти никакого решения.
Вот код:
class MapOverlay extends com.google.android.maps.Overlay
{
@Override
public boolean draw(Canvas canvas, MapView mapView,
boolean shadow, long when)
{
return false;
}
@Override
public boolean onTap(GeoPoint p, MapView mapView) {
// TODO Auto-generated method stub
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = TpActivity.this.getResources().getDrawable(R.drawable.marker);
HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable,TpActivity.this);
OverlayItem overlayitem = new OverlayItem(p, "", "");
itemizedoverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedoverlay);
mapView.invalidate();
latitude=p.getLatitudeE6() / 1E6;
longitude=p.getLongitudeE6() /1E6 ;
Toast.makeText(TpActivity.this,
p.getLatitudeE6() / 1E6 ","
p.getLongitudeE6() /1E6 ,
Toast.LENGTH_SHORT).show();
new AlertDialog.Builder(TpActivity.this)
.setTitle("Change city")
.setMessage("go to the new location?")
.setNegativeButton("NO", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.dismiss();
}
})
.setPositiveButton("YES", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
new newasync().execute();
}
}).show();
return true;
}
Комментарии:
1. моя основная цель — позволить пользователю выбрать любое местоположение на карте и прикрепить маркер к последнему местоположению, затронутому user…to дайте ему визуальное подтверждение того, к какому месту он прикоснулся
Ответ №1:
я использовал функцию рисования класса overlay вместо itemizedoverlay вот код:
Geopoint k;
oncreate код здесь:
mapview = (MapView) findViewById(R.id.mapView);
mapview.setBuiltInZoomControls(true);
List<Overlay> mapOverlays = mapview.getOverlays();
MapOverlay mapOverlay = new MapOverlay();
mapOverlays.add(mapOverlay);
класс наложения:
class MapOverlay extends com.google.android.maps.Overlay
{
@Override
public boolean onTap(GeoPoint p, MapView mapView) {
// TODO Auto-generated method stub
Drawable drawable = TpActivity.this.getResources().getDrawable(R.drawable.marker);
/* List<Overlay> mapOverlays = mapView.getOverlays();
HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable,TpActivity.this);
OverlayItem overlayitem = new OverlayItem(p, "", "");
itemizedoverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedoverlay);*/
k = p;
mc= mapView.getController();
mc.animateTo(p);
// Point pt=mapView.getProjection().toPixels(p, null);
mapView.invalidate();
latitude=p.getLatitudeE6() / 1E6;
longitude=p.getLongitudeE6() /1E6 ;
Toast.makeText(TpActivity.this,
p.getLatitudeE6() / 1E6 ","
p.getLongitudeE6() /1E6 ,
Toast.LENGTH_SHORT).show();
new AlertDialog.Builder(TpActivity.this)
.setTitle("Change city")
.setMessage("go to the new location?")
.setNegativeButton("NO", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.dismiss();
}
})
.setPositiveButton("YES", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
new newasync().execute();
}
}).show();
return true;
}
@Override
public boolean draw(Canvas canvas, MapView mapView,
boolean shadow, long when)
{
super.draw(canvas, mapView, shadow);
if(k!=null)
{
//---translate the GeoPoint to screen pixels---
Point screenPts = new Point();
mapView.getProjection().toPixels(k, screenPts);
//---add the marker---
Bitmap bmp = BitmapFactory.decodeResource(
getResources(), R.drawable.marker);
canvas.drawBitmap(bmp, screenPts.x-10, screenPts.y-34, null);
}
return true;
}