2011-05-06 139 views
3

你将如何去创建和覆盖整个地图的ItemizedOverlay?Android覆盖整个地图

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

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

我已经使用LinearLayout drawables进行了实验,但它似乎只能将可绘制图像用作标记。

这里是我的代码

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> 

在此先感谢

+0

为什么要中断对区域触摸事件,而不需要标记? – Flo 2011-05-06 08:22:16

+0

我使用背景触摸来关闭用户点击标记时显示的弹出视图。 – railwayparade 2011-05-06 12:01:08

回答

4

好了,所以我想它出。要覆盖整个地图,您需要添加一个简单的Overlay子类,但不能绘制。并使用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); 
0

你可以只覆盖现有ItemizedOverlays的一个叠加的中的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) - 在地图上的任何地方检测水龙头