vam*_*ibm 23 android long-click android-mapview
如何长时间点击地图视图,以便在地图上的该点显示地点标记?
我试了几次没有成功:
1)使用setOnLongClickListener在MapvView其从未检测出的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)
我知道这样做的最好方法是使用开源mapview-overlay-manager并使用其提供回调的手势监听器
public void onLongPress(MotionEvent e, ManagedOverlay overlay)
Run Code Online (Sandbox Code Playgroud)