【问题标题】:Android Overlay Entire MapAndroid 覆盖整个地图
【发布时间】:2011-05-06 07:35:19
【问题描述】:

您将如何创建覆盖整个地图的 ItemizedOverlay?

我在地图上有多个标记,它们是 ItemizedOverlay 类。

我想创建另一个覆盖整个地图的 ItemizedOverlay,以拦截不在我的标记上而是在地图本身上的触摸事件。我读过类似one 的其他 SO 问题,唯一的方法是通过 ItemizedOverlay->onTap。问题是我不知道如何创建覆盖整个地图的可绘制标记。

我已经尝试过 LinearLayout 可绘制对象,但它似乎只能使用可绘制图像作为标记。

这是我的代码

    private class BackgroundOverlay<Item extends OverlayItem> extends ItemizedOverlay<OverlayItem>{

    private ArrayList<OverlayItem> overlays = new ArrayList<OverlayItem>();

    /**
     * @param defaultMarker
     */
    public BackgroundOverlay(Drawable defaultMarker,Context context) {
        super(boundCenterBottom(defaultMarker));
    }

    @Override
    protected OverlayItem createItem(int i) {
        return overlays.get(i);
    }

    @Override
    public int size() {
        return overlays.size();
    }

    public void addOverlay(OverlayItem overlay) {
        overlays.add(overlay);
        populate();
    }
    protected boolean onTap(int index){
        Toast.makeText(getApplicationContext(), "Touched background",Toast.LENGTH_SHORT).show();            
        return true;    
    }

}

并创建叠加层

        Drawable d=this.getResources().getDrawable(R.layout.full_screen);
    BackgroundOverlay<OverlayItem> lay = new BackgroundOverlay<OverlayItem>(d,this);
    overlayItem = new OverlayItem(this.mapView.getMapCenter(), "", "");
    lay.addOverlay(overlayItem);
    mapOverlays.add(lay);

和可绘制的 xml

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/blue">
</LinearLayout>

提前致谢

【问题讨论】:

  • 为什么要中断没有标记区域的触摸事件?
  • 我使用背景触摸来关闭用户点击标记时显示的弹出视图。

标签: android android-mapview itemizedoverlay


【解决方案1】:

好的,我想通了。要覆盖整个地图,您添加一个简单的 Overlay 子类,没有可绘制的 duh。并使用 onTap 事件。

    private class BackgroundOverlay extends Overlay{
    public boolean onTap (final GeoPoint p, final MapView mapView){
        Toast.makeText(getApplicationContext(), "Touched background",Toast.LENGTH_SHORT).show();
        hideOtherFires(mapView.getOverlays());          
        return true;
    }

并在其他叠加层之前实例化,使其位于下方

//add a background overlay to intercept touches on background
    BackgroundOverlay lay = new BackgroundOverlay();
    mapOverlays.add(lay);

【讨论】:

    【解决方案2】:

    您可以在现有的 ItemizedOverlays 之一中覆盖 Overlay 的 onTap 方法:

    /* (non-Javadoc)
     * @see com.google.android.maps.Overlay#onTap(com.google.android.maps.GeoPoint, com.google.android.maps.MapView)
     */
    @Override
    public boolean onTap(GeoPoint p, MapView mapView) {
        super.onTap(p, mapView);
        OverlayItem item = getFocus();
        mapView.refreshDrawableState();
        return false;
    }
    

    确保将其传递给超类,否则您的 onTap(int index) 将不会收到该事件。

    换一种说法:

    onTap(int index) - 检测对 OverlayItems 的点击

    onTap(GeoPoint p, MapView mapView) - 检测地图上任意位置的点击

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多