Я использовал OnTap в своем оверлее, и он хорошо работает.
В моем методе Draw я заполняю ArrayList объектов, которые представляют отображаемую сущность (ATM в вашем случае).У каждого из этих объектов есть значения широты и долготы.
В onTap я сравниваю повернутую точку с широтой / долготой каждого объекта в моем ArrayList (заполняется во время рисования).Если касание попадает в точку, находящуюся в непосредственной близости от объекта, я могу отобразить его детали.
У меня есть некоторый исходный код, который я могу опубликовать в какой-то момент, если это звучит так, как вы хотите.
[Edit] Вот исходный код, который я взломал биты, которые вам понадобятся.Обратите внимание, что есть некоторые ссылки на bubbleLayouts и т. Д., Которые вам не понадобятся, но их легче оставить.
Обратите внимание, что всегда есть несколько способов сделать что угодно -это может быть не лучшим способом, но это работает для меня; -)
import java.util.ArrayList;
import java.util.Iterator;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.RectF;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Projection;
import com.google.android.maps.MapView.LayoutParams;
import com.google.android.maps.Overlay;
public class EnhancedStationOverlay extends Overlay {
private MapView _mapView;
private Context _context;
private LinearLayout _bubbleLayout;
private int _defaultMarker;
private ArrayList<station> _stationLocations;
private ArrayList<station> _displayedStations;
// private RectF debugHitRect = new RectF();
public EnhancedStationOverlay(int defaultMarker, MapView mapView, LinearLayout bubbleLayout, ArrayList<station> stationList) {
_stationLocations = stationList;
_mapView = mapView;
_context = mapView.getContext();
_bubbleLayout = bubbleLayout;
_defaultMarker = defaultMarker;
}
public boolean onTap(GeoPoint p, MapView mapView) {
station tappedStation = FetchTappedStation(mapView, p);
if (tappedStation != null) {
// Display Bubble containing Location Details
}
return true;
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
Projection projection = mapView.getProjection();
super.draw(canvas, mapView, shadow);
// Need to resolve top, bottom, left and right coordinates in relation to the map
// Height & Width
int latSpan = mapView.getLatitudeSpan();
int lngSpan = mapView.getLongitudeSpan();
// Centre Point
GeoPoint mapCenter = mapView.getMapCenter();
// Left and Right
int mapLeftGeo = mapCenter.getLongitudeE6() - (lngSpan / 2);
int mapRightGeo = mapCenter.getLongitudeE6() + (lngSpan / 2);
// Top and Bottom
int mapTopGeo = mapCenter.getLatitudeE6() - (latSpan / 2);
int mapBottomGeo = mapCenter.getLatitudeE6() + (latSpan / 2);
if (shadow != false) {
// Create an empty ArrayList
_displayedStations = new ArrayList<station>();
// Loop through stations
for (station currentStation : _stationLocations) {
// Resolve current station location to a GeoPoint
GeoPoint point = new GeoPoint((int) currentStation.getLatitude(), (int) currentStation.getLongitude());
// Determine whether it falls within the screens view of the map
if ((point.getLatitudeE6() > mapTopGeo && point.getLatitudeE6() < mapBottomGeo)
&& (point.getLongitudeE6() > mapLeftGeo && point.getLongitudeE6() < mapRightGeo)) {
// Yes it does - configure and place marker (pushpin)
Point myPoint = new Point();
projection.toPixels(point, myPoint);
Bitmap stationMarker = BitmapFactory.decodeResource(_context.getResources(), _defaultMarker);
canvas.drawBitmap(stationMarker, myPoint.x - 15, myPoint.y - 30, null);
// Add this location to the collection of displayed locations
_displayedStations.add(currentStation);
}
}
}
}
private station FetchTappedStation(MapView mapView, GeoPoint geo) {
// As in Draw() - Need to resolve top, bottom, left and right coordinates in relation to the map (could refactor this)
int latSpan = mapView.getLatitudeSpan();
int lngSpan = mapView.getLongitudeSpan();
GeoPoint mapCenter = mapView.getMapCenter();
int mapLeftGeo = mapCenter.getLongitudeE6() - (lngSpan / 2);
int mapRightGeo = mapCenter.getLongitudeE6() + (lngSpan / 2);
int mapTopGeo = mapCenter.getLatitudeE6() - (latSpan / 2);
int mapBottomGeo = mapCenter.getLatitudeE6() + (latSpan / 2);
// Track which MapLocation was hit…if any
station hitMapLocation = null;
RectF hitTestRecr = new RectF();
Point screenCoords = new Point();
Point tappedCoords = new Point();
Iterator<station> iterator = _displayedStations.iterator();
// Iterate over displayed stations...
while (iterator.hasNext()) {
station testLocation = iterator.next();
// Translate MapLocation lat/long to screen coordinates
GeoPoint test = new GeoPoint((int) testLocation.getLatitude(), (int) testLocation.getLongitude());
Projection projection = mapView.getProjection();
projection.toPixels(test, screenCoords);
if (screenCoords.x != 0 && screenCoords.y != 0) {
// Create a 'hit testing' rectangle
hitTestRecr.set(-20, -50, 20, 15);
// Next, offset the Rectangle 'surround' current location’s
// icon on the screen.
hitTestRecr.offset(screenCoords.x, screenCoords.y);
// Finally test for match between ‘hit’ Rectangle and
// location clicked by the user.
// If a hit occurred, then we stop processing and return the
// result;
projection.toPixels(geo, tappedCoords);
if (hitTestRecr.contains(tappedCoords.x, tappedCoords.y)) {
hitMapLocation = testLocation;
break;
}
}
}
return hitMapLocation;
}
}