package com.dwdesign.tweetings.view; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.view.MotionEvent; import com.dwdesign.tweetings.events.PanChangeListener; import com.dwdesign.tweetings.events.ZoomChangeListener; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapView; public class ExtendedMapView extends MapView { private int currentZoomLevel = -1; private GeoPoint currentCenter; private List<ZoomChangeListener> zoomEvents = new ArrayList<ZoomChangeListener>(); private List<PanChangeListener> panEvents = new ArrayList<PanChangeListener>(); public ExtendedMapView(final Context context, final AttributeSet attrs, final int defStyle) { super(context, attrs, defStyle); } public ExtendedMapView(final Context context, final String apiKey) { super(context, apiKey); } public ExtendedMapView(final Context context, final AttributeSet attrs) { super(context, attrs); } public int[][] getBounds() { GeoPoint center = getMapCenter(); int latitudeSpan = getLatitudeSpan(); int longtitudeSpan = getLongitudeSpan(); int[][] bounds = new int[2][2]; bounds[0][0] = center.getLatitudeE6() + (latitudeSpan / 2); bounds[0][1] = center.getLongitudeE6() + (longtitudeSpan / 2); bounds[1][0] = center.getLatitudeE6() - (latitudeSpan / 2); bounds[1][1] = center.getLongitudeE6() - (longtitudeSpan / 2); return bounds; } public boolean onTouchEvent(final MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_UP) { GeoPoint centerGeoPoint = this.getMapCenter(); if (currentCenter == null || (currentCenter.getLatitudeE6() != centerGeoPoint.getLatitudeE6()) || (currentCenter.getLongitudeE6() != centerGeoPoint.getLongitudeE6()) ) { firePanEvent(currentCenter, this.getMapCenter()); } currentCenter = this.getMapCenter(); } return super.onTouchEvent(ev); } @Override protected void dispatchDraw(final Canvas canvas) { super.dispatchDraw(canvas); if(getZoomLevel() != currentZoomLevel){ fireZoomLevel(currentZoomLevel, getZoomLevel()); currentZoomLevel = getZoomLevel(); } } private void fireZoomLevel(final int old, final int current){ for(ZoomChangeListener event : zoomEvents){ event.onZoom(old, current); } } private void firePanEvent(final GeoPoint old, final GeoPoint current){ for(PanChangeListener event : panEvents){ event.onPan(old, current); } } public void addZoomChangeListener(final ZoomChangeListener listener){ this.zoomEvents.add(listener); } public void addPanChangeListener(final PanChangeListener listener){ this.panEvents.add(listener); } }