android地图:如何长期点击地图?

vam*_*ibm 23 android long-click android-mapview

如何长时间点击地图视图,以便在地图上的该点显示地点标记?

我试了几次没有成功:

1)使用setOnLongClickListenerMapvView其从未检测出的longclicks.

2)我的另一个想法是扩展MapView到覆盖dispatchTouchEvent..创建一个GestureDetector来响应longpress回调.但我被困在中途,因为我无法处理我的子类Mapview.即

MyMapview mymapview; //MyMapView extends MapView

//results in a classcast exception
mymapView = (MyMapView) findViewById(R.id.map);
Run Code Online (Sandbox Code Playgroud)

3)我知道如何尝试这个的唯一另一种方法是:检测MotionEvent.ACTION_DOWN并将延迟的runnable发布到处理程序并检测longpress是否还有其他两个事件:acton_move或action_up.

有人可以提供任何这些方法的想法来检测长按吗?

Dav*_*lli 22

我找到了一种更简单的方法.只需将叠加层作为列表中第一个不绘制任何内容的叠加层,并使用它来使用GestureDetector识别手势.如果它处理事件,它应该返回true,因此它不会传播.

    List<Overlay> overlays = mapView.getOverlays();
    overlays.clear();
    overlays.add(new MapGestureDetectorOverlay(new MyOnGestureListener()));
Run Code Online (Sandbox Code Playgroud)

这是班级:

public class MapGestureDetectorOverlay extends Overlay implements OnGestureListener {
 private GestureDetector gestureDetector;
 private OnGestureListener onGestureListener;

 public MapGestureDetectorOverlay() {
  gestureDetector = new GestureDetector(this);
 }

 public MapGestureDetectorOverlay(OnGestureListener onGestureListener) {
  this();
  setOnGestureListener(onGestureListener);
 }

 @Override
 public boolean onTouchEvent(MotionEvent event, MapView mapView) {
  if (gestureDetector.onTouchEvent(event)) {
   return true;
  }
  return false;
 }

 @Override
 public boolean onDown(MotionEvent e) {
  if (onGestureListener != null) {
   return onGestureListener.onDown(e);
  }
  return false;
 }

 @Override
 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
   float velocityY) {
  if (onGestureListener != null) {
   return onGestureListener.onFling(e1, e2, velocityX, velocityY);
  }
  return false;
 }

 @Override
 public void onLongPress(MotionEvent e) {
  if (onGestureListener != null) {
   onGestureListener.onLongPress(e);
  }
 }

 @Override
 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
   float distanceY) {
  if (onGestureListener != null) {
   onGestureListener.onScroll(e1, e2, distanceX, distanceY);
  }
  return false;
 }

 @Override
 public void onShowPress(MotionEvent e) {
  if (onGestureListener != null) {
   onGestureListener.onShowPress(e);
  }
 }

 @Override
 public boolean onSingleTapUp(MotionEvent e) {
  if (onGestureListener != null) {
   onGestureListener.onSingleTapUp(e);
  }
  return false;
 }

 public boolean isLongpressEnabled() {
  return gestureDetector.isLongpressEnabled();
 }

 public void setIsLongpressEnabled(boolean isLongpressEnabled) {
  gestureDetector.setIsLongpressEnabled(isLongpressEnabled);
 }

 public OnGestureListener getOnGestureListener() {
  return onGestureListener;
 }

 public void setOnGestureListener(OnGestureListener onGestureListener) {
  this.onGestureListener = onGestureListener;
 }
}
Run Code Online (Sandbox Code Playgroud)


I82*_*uch 8

我知道这样做的最好方法是使用开源mapview-overlay-manager并使用其提供回调的手势监听器

public void onLongPress(MotionEvent e, ManagedOverlay overlay)
Run Code Online (Sandbox Code Playgroud)