【问题标题】:Creating MapView with ContextMenu without Overlays使用没有覆盖的 ContextMenu 创建 MapView
【发布时间】:2010-10-27 05:15:30
【问题描述】:

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

问题:

有没有办法在不使用叠加层的情况下显示地图的上下文菜单?为什么?

【问题讨论】:

    标签: android google-maps maps android-mapview


    【解决方案1】:

    这是我使用的方法。我创建了一个扩展 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;
    }
    

    }

    希望这会有所帮助。

    【讨论】:

    • 您花时间和精力编写代码以供您指导和帮助,谢谢!!
    • 没问题,我很高兴它有帮助。回馈一些东西真是太好了。
    【解决方案2】:

    尝试为 mapView 编写 onKeyLongPress 方法可能值得一试。为此,您必须创建另一个扩展 MapView 的类,然后使用新类代替您的 MapView。只需有一个默认构造函数,它遵循超级构造函数。如果您让它生成超类构造函数,Eclipse 会自动为您创建它。

    从那里,覆盖 onKeyLongPress,让它调用您通常会显示菜单的任何方法。

    【讨论】:

      【解决方案3】:

      onKeyLongPress 就是这个意思。一个KEY被按住了。你想要做的是实现一个 GestureListener。下面是一个关于如何让它发挥作用的示例:

      GestureListener Example

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-15
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多