Android перекрывает всю карту - PullRequest
4 голосов
/ 06 мая 2011

Как бы вы пошли о создании и ItemizedOverlay, который охватывает всю карту?

У меня есть несколько маркеров на карте, которые являются классами ItemizedOverlay.

Я хочу создать еще один ItemizedOverlay, который охватывает всю карту, чтобы перехватывать события касания, которые находятся не на моих маркерах, а на самой карте. Я читал в других SO-вопросах, подобных этому one , что единственный способ сделать это - через ItemizedOverlay-> onTap. Проблема в том, что я не знаю, как создать маркер Drawable, который покрывает всю карту.

Я экспериментировал с рисованными объектами 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>

Заранее спасибо

Ответы [ 2 ]

5 голосов
/ 06 мая 2011

Хорошо, так что я понял это.Чтобы наложить всю карту, вы добавляете простой подкласс 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 голосов
/ 18 мая 2011

Вы можете просто переопределить метод onTap в Overlay в одном из ваших существующих ItemizedOverlays:

/* (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) - обнаруживает нажатия в любом месте на карте

...