使用ContextMenu创建MapView而不使用Overlays

时间:2010-10-27 05:15:31

标签: android google-maps maps android-mapview

我有一个mapview,我想在longclick时显示一个ContextMenu,但到目前为止我找到的最接近的解决方案是here on anddev,我不喜欢这种方法的主要原因是因为任何点击都会激活ContextMenu而不是长按一下。

问题:

有没有办法在不使用叠加层的情况下显示地图的ContextMenu?为什么呢?

3 个答案:

答案 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。以下是如何实现这一目标的示例:

GestureListener Example

当然,您获得的所有信息都将以像素为单位,因此您需要将其投影到地图空间中以获得拉长。