OnClickListener for pushpin

2020-05-07 09:34发布

问题:

Here I have used google map and an overlay. I have used an image of pushpin to point to the GeoPoint.

I want to set an OnClickListener event for the push pin. When user touches the pin, I want to toast a message. Below is the code.

import java.util.List;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Point;
import android.os.Bundle;
import android.widget.Toast;

public class Googlemap1_6Activity extends MapActivity 
{
    /** Called when the activity is first created. */
    MapView mapView;
    MapController mc;
    GeoPoint p;

class Mapoverlay extends com.google.android.maps.Overlay
{

    @Override
    public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
            long when) 
    {
        // TODO Auto-generated method stub
        super.draw(canvas, mapView, shadow, when);

        Point screenPts =new Point();
            mapView.getProjection().toPixels(p, screenPts);
            Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pushpin2);
            canvas.drawBitmap(bmp,  screenPts.x, screenPts.y-26, null);


        return true;
    }

    @Override
    public boolean onTap(GeoPoint pl, MapView mapView) {
        // TODO Auto-generated method stub


         if(pl.equals(p))
        {

             Toast.makeText(getBaseContext(),
                        "This is International Airport",
                        Toast.LENGTH_LONG).show();
         }

         return super.onTap(pl, mapView);
}

}

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    String lat_coordinates[] ={"27.700556"};
    String lng_coordinates[] ={"85.3630"}; 

    Double lat = Double.parseDouble(lat_coordinates[0]);
    Double lng = Double.parseDouble(lng_coordinates[0]);

    p = new GeoPoint(
            (int) (lat*1E6),
            (int) (lng*1E6));

    mapView = (MapView) findViewById(R.id.mapView);
    mc=mapView.getController();
    mapView.setBuiltInZoomControls(true);
    mc.setZoom(10); 
    mc.animateTo(p);


    Mapoverlay MapOverlay  = new Mapoverlay();
    List<Overlay> listofOverlays = mapView.getOverlays();
    listofOverlays.clear();
    listofOverlays.add(MapOverlay);

    mapView.invalidate();


}
@Override
protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
}

}

回答1:

You Override your own Overlay, so you have to handle Tabs yourself. Why not using ItemizedOverlay. Override the onTab(int index) there and you are done. It has also a useful hitTest Method.



回答2:

Use Below link's Code for that, it may help you.

MapViewBallons



回答3:

Thank guys, for you support... In the mean time, i solved my problem so i am posting it here, hope it will help some one else...

package org.nip.gmap;

import java.util.List;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
import android.graphics.drawable.Drawable;
import android.os.Bundle;

public class Main extends MapActivity {


    /** Called when the activity is first created. */

    MapView map;
    MapController controller;
    List<Overlay> overlayList;
    int lat=0;
    int lng=0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        map = (MapView) findViewById(R.id.mapView);
        map.setBuiltInZoomControls(true);

        overlayList = map.getOverlays();
        Drawable drawable = this.getResources().getDrawable(R.drawable.pushpin2);
        CustomPinpoint itemizedoverlay = new CustomPinpoint(drawable,this);


        double lat_coordinates[] ={27.700556,28.2642635,30.0018168,29.776669,29.4096819,29.4560611};
        double lng_coordinates[] ={85.3630,83.9735195,80.7382742,81.2518833,81.8115051,80.5403779};
        String place_name[] ={"kathmandu","Pokhara","Darchula","Bajhang","Bajura","Baitadi"};
        String place_info[] ={"Its an capital of Nepal","Its and tourist place of Nepal","Its one of the beautiful place in country side","CHD District Target:10 51,960, VDCs/Muncipalities reported:41/41","CHD District Target: 71,280, VDCs/Muncipalities reported: 47/47","CHD District Target:10 51,960, VDCs/Muncipalities reported:41/41","CHD District Target: 71,280, VDCs/Muncipalities reported: 7/7","CHD District Target:10 21,960, VDCs/Muncipalities reported:44/41","CHD District Target: 33,3123, VDCs/Muncipalities reported: 47/47"};

         try{
            for(int i=0; i<place_name.length; i++)
             {
                 GeoPoint point = new GeoPoint((int)(lat_coordinates[i]*1E6),(int)(lng_coordinates[i]*1E6));
                 OverlayItem overlayitem = new OverlayItem(point, place_name[i], place_info[i]);
                 itemizedoverlay.addOverlay(overlayitem);
             }
         }catch(NullPointerException e){
             e.getStackTrace();

         }
         finally{
            overlayList.add(itemizedoverlay);
         }

        controller = map.getController();
        controller.animateTo(new GeoPoint((int)(lat_coordinates[0]*1E6),(int)(lng_coordinates[0]*1E6)));
        controller.setZoom(8);


    }

    @Override
    protected boolean isRouteDisplayed() {
        // TODO Auto-generated method stub
        return false;
    }

}

Create new class...

package org.nip.gmap;

import java.util.ArrayList;

import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;

//import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;

public class CustomPinpoint extends ItemizedOverlay<OverlayItem> {

    private ArrayList<OverlayItem> pinpoints = new ArrayList<OverlayItem>();
    private Context c;


    public CustomPinpoint(Drawable defaultMarker, Context context) {
        super(boundCenter(defaultMarker));
        c= context;

    }

//  public CustomPinpoint(Drawable M, Context context) {
//      
//      this(M);
//      c= context;
//  }

    public void addOverlay (OverlayItem overlay)
    {
        pinpoints.add(overlay);

        populate();
    }

    @Override
    protected OverlayItem createItem(int i) {
        // TODO Auto-generated method stub
        return pinpoints.get(i);
    }

    @Override
    public int size() {

        // TODO Auto-generated method stub
        return pinpoints.size();
    }
    @Override
    protected boolean onTap(int index) {
        // TODO Auto-generated method stub
        OverlayItem item = pinpoints.get(index);
        AlertDialog.Builder dialog = new AlertDialog.Builder(c);
        dialog.setTitle(item.getTitle());
        dialog.setMessage(item.getSnippet());
        dialog.show();
        return true;

    }


}