2012-01-16 2 views
4

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

Я добавил 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()); 
    } 

} 
+0

если у г с помощью детализированной накладки, то я думаю, уры ​​проблема связана с boundCenterBottom(); –

+2

Я обновляю свой код. Что это значит связанный boundCenterBottom(). Пожалуйста, помогите мне. – DuyguK

ответ

0

Вот полный учебник по MapView: comprehensive google maps tutorials

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

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

0

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

На вашем CustomItemizedOverlay, пусть делает накладку в boundCenterBottom

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

И в вашей карте Activty, когда создать маркер вытяжку, давайте делать трюк, как это (спасибо Кирилл Mottier за его Polaris mapview library) :

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

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

Blog

Смежные вопросы