0

カスタムの中央オーバーレイ アイテムをマップに配置できません。常に下部と中央の中央に表示されます。これが私のコードです:

------------私のオーバーレイアイテムクラス-------------

public class EditionThumbOverlayItem extends OverlayItem {

    public EditionThumbOverlayItem(GeoPoint aGeoPoint, Resources resources) {
        super("", "", aGeoPoint);
        Drawable pinThumbDrawable = resources.getDrawable(R.drawable.pin_thumb);
        pinThumbDrawable.setBounds(pinThumbDrawable.getIntrinsicWidth() * (-2 / 5),
                pinThumbDrawable.getIntrinsicHeight() * (-2 / 5), pinThumbDrawable.getIntrinsicWidth() * 3 / 5,
                pinThumbDrawable.getIntrinsicHeight() * 3 / 5);
        setMarker(pinThumbDrawable);
    }

}

--------------私のアイテム化されたオーバーレイクラス-----------------

public class PinThumbOverlay extends ItemizedOverlay<OverlayItem> {
    // Only one item can be set on this overlay
    private OverlayItem mEditionThumb;

    public PinThumbOverlay(Drawable pDefaultMarker, ResourceProxy pResourceProxy) {
        super(pDefaultMarker, pResourceProxy);
    }

    @Override
    public boolean onSnapToItem(int arg0, int arg1, Point arg2, IMapView arg3) {
        return false;
    }

    @Override
    protected OverlayItem createItem(int arg0) {
        return mEditionThumb;
    }

    @Override
    public int size() {
        if (mEditionThumb == null) {
            return 0;
        } else {
            return 1;
        }
    }

    public void addOverlayItem(OverlayItem overlay) {
        mEditionThumb = overlay;
        populate();
    }

    public void removeOverlayItem() {
        mEditionThumb = null;
        populate();
    }
}

---アイテム化されたオーバーレイの作成----------------------

DefaultResourceProxyImpl defaultResouceProxyImpl = new DefaultResourceProxyImpl(getApplicationContext());
Drawable defaultPinEdition = getResources().getDrawable(R.drawable.pin_thumb);
                mPinThumbOverlay = new PinThumbOverlay(defaultPinEdition, defaultResouceProxyImpl);
mMapView.getOverlays().clear();
mMapView.getOverlays().add(mPinThumbOverlay);

-------------------オーバーレイアイテムの作成---------------

EditionThumbOverlayItem editionThumb = new EditionThumbOverlayItem(new GeoPoint(mCurrentUserLocation),
                getResources());
        mPinThumbOverlay.addOverlayItem(editionThumb);

注: デフォルトの Google マップ API ではなく、osmdroid マップを使用します。

4

2 に答える 2

3

osmdroid は、ItemizedOverlay の onDrawItem メソッドの drawble.setBounds() メソッドで設定した値を上書きするようです。

protected void onDrawItem(final Canvas canvas, final Item item, final Point curScreenCoords) {
    final int state = (mDrawFocusedItem && (mFocusedItem == item) ? OverlayItem.ITEM_STATE_FOCUSED_MASK
            : 0);
    final Drawable marker = (item.getMarker(state) == null) ? getDefaultMarker(state) : item
            .getMarker(state);
    final HotspotPlace hotspot = item.getMarkerHotspot();

    boundToHotspot(marker, hotspot);

    // draw it
    Overlay.drawAt(canvas, marker, curScreenCoords.x, curScreenCoords.y, false);
}

むしろ、実際の上書きは boundToHotspot(marker,hotspot); で行われます。方法。

これを克服するには、ドローアブルに境界を設定する代わりに、OverlayItem にホットスポットを設定します。例:

GeoPoint point = new GeoPoint(currentLoc);
OverlayItem item = new OverlayItem("my location", "my loc", point);
item.setMarkerHotspot(HotspotPlace.BOTTOM_CENTER); 

これにより、探している結果が得られるはずです。

于 2012-12-10T16:28:48.567 に答える
0

If you just want to put a marker in the map center, use this code snippet:

public class MyActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.main);
        mapView = (MapView) findViewById(R.id.mapview);
        mapView.setBuiltInZoomControls(true);
        mapView.setMultiTouchControls(true);
        mapView.setClickable(true);
        mapView.setUseDataConnection(true);
        mapView.getController().setZoom(MAP_DEFAULT_ZOOM);
        mapView.setTileSource(TileSourceFactory.MAPNIK);
        resourceProxy = new DefaultResourceProxyImpl(getApplicationContext()); 

        GeoPoint location = getLocation()
        ItemizedIconOverlay<OverlayItem> currentLocationOverlay; 
        Drawable marker = this.getResources().getDrawable(R.drawable.custom_marker);
        OverlayItem myLocationOverlayItem = new OverlayItem("Here", "Current Position", location); 
        myLocationOverlayItem.setMarker(marker);  
        final ArrayList<OverlayItem> items = new ArrayList<OverlayItem>();
        items.add(myLocationOverlayItem);
        currentLocationOverlay = new ItemizedIconOverlay<OverlayItem>(items,
                new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
                    public boolean onItemSingleTapUp(final int index, final OverlayItem item) {
                        return true;
                    }
                    public boolean onItemLongPress(final int index, final OverlayItem item) {
                        return true;
                    }
                }, resourceProxy);        

     mapView.getOverlays().add(this.currentLocationOverlay);
     mapView.getController().setCenter(location);

 } 
于 2012-07-12T06:50:14.920 に答える