Добавление булавки неправильное место в просмотре карты? - PullRequest
4 голосов
/ 16 января 2012

Я работаю с Google Map. Моя проблема в том, что когда я касаюсь экрана, карта не добавляет булавку в нужном месте. Добавляем почти Ycoordinate-50.

Я также добавил CustomitemzedOverlay.

Что не так с кодом?

Кто-нибудь может мне помочь?

Код:

 public void AddPoint(Drawable drawable, MapView mapView, MotionEvent motionEvent) {

        p = mapView.getProjection().fromPixels((int) (motionEvent.getX()),(int) (motionEvent.getY()));
        final MapController mc = mapView.getController();
        mc.setZoom(16);
        CustomItemizedOverlay<CustomOverlayItem> itemizedOverlay = new CustomItemizedOverlay<CustomOverlayItem>(drawable, mapView);

        itemizedOverlay.addOverlay(new CustomOverlayItem(p,"","",""));
        mapView.getOverlays().add(itemizedOverlay);
        mc.animateTo(p);
        mapView.invalidate();
    }




package com.example;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.widget.Toast;
import com.google.android.maps.MapView;
import com.google.android.maps.OverlayItem;

import java.util.ArrayList;



public class CustomItemizedOverlay<Item extends OverlayItem> extends BalloonItemizedOverlay<CustomOverlayItem> {

    private ArrayList<CustomOverlayItem> m_overlays = new ArrayList<CustomOverlayItem>();
    private Context c;

    public CustomItemizedOverlay(Drawable defaultMarker, MapView mapView) {
        super(boundCenter(defaultMarker), mapView);
        c = mapView.getContext();
    }

    public void addOverlay(CustomOverlayItem overlay) {
        m_overlays.add(overlay);
        populate();
    }

    public void removeOverlay(CustomOverlayItem overlay) {
        m_overlays.remove(overlay);
        populate();
    }

    @Override
    protected CustomOverlayItem createItem(int i) {
        return m_overlays.get(i);
    }

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

    @Override
    protected boolean onBalloonTap(int index, CustomOverlayItem item) {
        Toast.makeText(c, "onBalloonTap for overlay index " + index,
                Toast.LENGTH_LONG).show();
        return true;
    }

    @Override
    protected BalloonOverlayView<CustomOverlayItem> createBalloonOverlayView() {
        // use our custom balloon view with our custom overlay item type:
        return new CustomBalloonOverlayView<CustomOverlayItem>(getMapView().getContext(), getBalloonBottomOffset());
    }

}

Ответы [ 3 ]

0 голосов
/ 23 октября 2012

У меня та же проблема, что и у вас при использовании библиотеки android-mapviewballoons . Мне нужно полдня, чтобы найти решение. Вот мое исправление:

На вашем CustomItemizedOverlay, давайте сделаем оверлей в boundCenterBottom

public CustomItemizedOverlay(Drawable defaultMarker, MapView mapView) {
    super(boundCenterBottom(defaultMarker), mapView);
    c = mapView.getContext();
}

А в вашей Map Activty, когда создаете маркер для рисования, позвольте сделать такой трюк (спасибо Кириллу Мотье за ​​его библиотеку Polaris mapview ):

drawable = MapViewUtils.boundMarkerCenterBottom(getResources().getDrawable(R.drawable.map_pin_holed_violet));

MapViewUtils получен из библиотеки Polaris. Вот его функция boundMarkerCenterBottom:

public static Drawable boundMarkerCenterBottom(Drawable marker) {
    return boundMarker(marker, Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM);
}
public static Drawable boundMarker(Drawable marker, int gravity) {
    if (marker == null) {
        return null;
    }

    final int width = marker.getIntrinsicWidth();
    final int height = marker.getIntrinsicHeight();

    if (width < 0 || height < 0) {
        throw new IllegalStateException("The given Drawable has no intrinsic width or height");
    }

    int left, top;

    switch (gravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
        case Gravity.LEFT:
            left = 0;
            break;
        case Gravity.RIGHT:
            left = -width;
            break;
        case Gravity.CENTER_HORIZONTAL:
        default:
            left = -width / 2;
            break;
        }

    switch (gravity & Gravity.VERTICAL_GRAVITY_MASK) {
        case Gravity.TOP:
            top = 0;
            break;
        case Gravity.CENTER_VERTICAL:
            top = -height / 2;
            break;
        case Gravity.BOTTOM:
        default:
            top = -height;
            break;
    }

    marker.setBounds(left, top, left + width, top + height);
    return marker;
}
0 голосов
/ 23 октября 2012

Я не уверен, но думаю, что проблема может быть в настройке масштаба после получения проекции. Я вообще-то. В блоге, в который я пишу AndroidDev101 , есть учебник, посвященный тому, что вы хотите, и который также должен дать вам то, что вам нужно для выполнения задачи добавления точки.

Блог

0 голосов
/ 16 января 2012

Вот полное руководство по просмотру карты: подробное руководство по Google Maps

вы можете создать оверлейный класс; и в onDraw() вы должны использовать getIntrinsicHeight() getIntrinsicWidth()/2

Также здесь есть учебник по детализированным наложениям , где вы можете использовать boundCenterBottom() для правильного позиционирования маркера

...