package nz.co.android.cowseye.gps; import java.util.ArrayList; import nz.co.android.cowseye.gps.ontap.OnTapInterface; import android.content.Context; import android.graphics.Paint; import android.graphics.Point; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import com.google.android.maps.GeoPoint; import com.google.android.maps.ItemizedOverlay; import com.google.android.maps.MapView; import com.google.android.maps.OverlayItem; public class MapItemizedOverlay extends ItemizedOverlay<OverlayItem> { //member variables private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); private Context mContext; private int mTextSize; private OnTapInterface onTapStrategy; public MapItemizedOverlay(Drawable defaultMarker, Context context, int textSize, OnTapInterface onTapStrategy) { super(boundCenterBottom(defaultMarker)); mContext = context; mTextSize = textSize; this.onTapStrategy = onTapStrategy; } //In order for the populate() method to read each OverlayItem, it will make a request to createItem(int) // define this method to properly read from our ArrayList @Override protected OverlayItem createItem(int i) { return mOverlays.get(i); } @Override public int size() { return mOverlays.size(); } @Override protected boolean onTap(int index) { OverlayItem item = mOverlays.get(index); if(item==null) throw new NullPointerException("No marker found at the given index!"); // uses strategy pattern return onTapStrategy.onTap(item, mContext); } @Override public void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow) { super.draw(canvas, mapView, shadow); if (shadow == false) { //cycle through all overlays for (int index = 0; index < mOverlays.size(); index++) { OverlayItem item = mOverlays.get(index); // Converts lat/lng-Point to coordinates on the screen GeoPoint point = item.getPoint(); Point ptScreenCoord = new Point() ; mapView.getProjection().toPixels(point, ptScreenCoord); //Paint Paint paint = new Paint(); paint.setTextAlign(Paint.Align.CENTER); paint.setTextSize(mTextSize); Typeface tf = Typeface.create("Helvetica",Typeface.BOLD); paint.setTypeface(tf); boolean isSat = mapView.isSatellite(); if(isSat) paint.setARGB(200, 255, 255, 255); // alpha, r, g, b (White, semi see-through) else paint.setARGB(200, 0, 0, 0); // alpha, r, g, b (Black, semi see-through) //show text to the right of the icon canvas.drawText(item.getTitle(), ptScreenCoord.x, ptScreenCoord.y+mTextSize, paint); } } } /** Adds an overlay but includes some extra information for the strategy object * to deal with */ public void addOverlayWithId(OverlayItem overlay, int friendID) { mOverlays.add(overlay); populate(); } public void addOverlay(OverlayItem overlay) { mOverlays.add(overlay); populate(); } public void removeOverlay(OverlayItem overlay) { mOverlays.remove(overlay); populate(); } public void removeAllOverlays() { mOverlays = new ArrayList<OverlayItem>(); populate(); } public void clear() { mOverlays.clear(); populate(); } }