【发布时间】:2010-10-27 05:15:30
【问题描述】:
我有一个地图视图,我希望在长按时显示 ContextMenu,但到目前为止,我找到的最接近的解决方案是 here on anddev,我不喜欢该方法的主要原因是因为任何点击都会激活 ContextMenu 而不是长按。
问题:
有没有办法在不使用叠加层的情况下显示地图的上下文菜单?为什么?
【问题讨论】:
标签: android google-maps maps android-mapview
我有一个地图视图,我希望在长按时显示 ContextMenu,但到目前为止,我找到的最接近的解决方案是 here on anddev,我不喜欢该方法的主要原因是因为任何点击都会激活 ContextMenu 而不是长按。
问题:
有没有办法在不使用叠加层的情况下显示地图的上下文菜单?为什么?
【问题讨论】:
标签: android google-maps maps android-mapview
这是我使用的方法。我创建了一个扩展 MapActivity 的 AbstractMap 类。然后我从这里扩展 AbstractMap 类以创建适合我要求的 Map。注意我只使用了这种方法,因为我的应用程序需要几个具有不同属性的地图。您可以简单地从 AbstractMap 中删除 Abstract 关键字,直接覆盖此类中的 OnGestureListener 方法并实例化它。
这是 AbstractMap 类
public abstract class AbstractMap extends MapActivity implements OnGestureListener, OnDoubleTapListener {
public MapView mapView;
public MapController mapController;
public List<Overlay> mapOverlays;
private GestureDetector detector;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.mapp);
detector = new GestureDetector(this, this);
mapView = (MapView) findViewById(R.id.mapview);
mapView.setOnTouchListener(otl);
mapController = mapView.getController();
mapOverlays = mapView.getOverlays();
} catch (Exception e) {
Log.e("Error", "Exception", e);
}
}
public OnTouchListener otl = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (detector.onTouchEvent(event))
return true;
else
return false;
}
};
}
这是长按地图
public class LongPressMap extends AbstractMap {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public boolean onDown(MotionEvent event) {
return false;
}
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
//Log.d("Debug","On Scrtoll");
// TODO Auto-generated method stub
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
return false;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
}
希望这会有所帮助。
【讨论】:
尝试为 mapView 编写 onKeyLongPress 方法可能值得一试。为此,您必须创建另一个扩展 MapView 的类,然后使用新类代替您的 MapView。只需有一个默认构造函数,它遵循超级构造函数。如果您让它生成超类构造函数,Eclipse 会自动为您创建它。
从那里,覆盖 onKeyLongPress,让它调用您通常会显示菜单的任何方法。
【讨论】:
onKeyLongPress 就是这个意思。一个KEY被按住了。你想要做的是实现一个 GestureListener。下面是一个关于如何让它发挥作用的示例:
当然,您获得的所有信息都将以像素为单位,因此您需要将其投影到您的地图空间中以获得经度。
【讨论】: