我有一个mapview,我想在longclick时显示一个ContextMenu,但到目前为止我找到的最接近的解决方案是here on anddev,我不喜欢这种方法的主要原因是因为任何点击都会激活ContextMenu而不是长按一下。
问题:
有没有办法在不使用叠加层的情况下显示地图的ContextMenu?为什么呢?
答案 0 :(得分:2)
这是我使用的方法。我创建了一个扩展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;
}
};
}
这是LongPressMap
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;
}
}
希望这有帮助。
答案 1 :(得分:0)
尝试为mapView编写onKeyLongPress方法可能值得一试。为此,您必须创建另一个扩展MapView的类,然后使用新类代替MapView。只需要一个遵循超级构造函数的默认构造函数。如果让它生成超类构造函数,Eclipse将自动为您创建。
从那里,覆盖onKeyLongPress,让它调用你通常用来显示菜单的任何方法。
答案 2 :(得分:0)
onKeyLongPress就是这个意思。一把钥匙被压制住了。你想要做的是实现一个GestureListener。以下是如何实现这一目标的示例:
当然,您获得的所有信息都将以像素为单位,因此您需要将其投影到地图空间中以获得拉长。