- 使用
onTap()
代替 onLongPress()
:
虽然 onLongPress()
可以使多边形响应点击事件,但在一些设备上会有一定的延迟。相反,onTap()
相对更快捷响应,稍作修改即可:
@Override
public boolean onTap(final GeoPoint p, final MapView mapView){
final Projection pj = mapView.getProjection();
final Point pt = pj.toPixels(p, null);
final Drawable d = getMarker(pj);
mapView.getOverlayManager().remove(this);
mapView.getOverlayManager().add(new MarkerWithPolyline(d, p));
return true;
}
- 利用单机和双击响应事件方法,重写
onSingleTapConfirmed()
和 onDoubleTap()
方法:
这种方法是以一个重载 Overlay
类的方式来实现。需要注意的是,虽然这种方法会比第一种响应更快,但由于需要判断单次点击和双击事件,读者需要全面考虑其适用性。代码如下:
public abstract class PolygonOverlay extends Overlay {
private final Polygon polygon;
private final Path path = new Path();
public PolygonOverlay(final Polygon polygon) {
this.polygon = polygon;
for (final List polygonPoints : polygon.getPoints()) {
final Path polyPath = new Path();
for (int i = 0; i < polygonPoints.size(); i++) {
final Point pt = new Point();
final Projection pj = mapView.getProjection();
pj.toPixels(polygonPoints.get(i), pt);
if (i == 0) {
polyPath.moveTo(pt.x, pt.y);
} else {
polyPath.lineTo(pt.x, pt.y);
}
}
path.addPath(polyPath);
}
}
@Override
public boolean onSingleTapConfirmed(final MotionEvent event, final MapView mapView) {
final Projection pj = mapView.getProjection();
final Point pt = new Point();
pt.x = (int) event.getX();
pt.y = (int) event.getY();
final GeoPoint clickedPoint = pj.fromPixels(pt.x, pt.y);
final boolean pointIsInPolygon = polygon.contains(clickedPoint);
if (pointIsInPolygon) {
onPolygonTapped();
return true;
}
return super.onSingleTapConfirmed(event, mapView);
}
@Override
public boolean onDoubleTap(final MotionEvent event, final