Размещение формы в MapView в Android - PullRequest
1 голос
/ 16 сентября 2011

Есть ли способ разместить фигуру (нарисованную или фигуру любого вида), которая занимает определенную область в MapView (область широты / долготы), а не область пикселей. Мне это нужно для целей кластеризации GeoPoint

Если это невозможно, мы будем благодарны за любые указания относительно координат проекции. Но использование холста MapView для этого не похоже на производительность, так как я постоянно перерабатываю свои оверлейные элементы, и я бы хотел воспользоваться этим тоже.

Ответы [ 2 ]

1 голос
/ 16 сентября 2011

Посмотрите на ItemizedOverlay

Я отбираю из своего кода, так что это, вероятно, не будет компилироваться из коробки, но должно дать вам достаточно, чтобы понять это отсюда ...

расширенный класс:

    public class MyOverlay extends ItemizedOverlay<OverlayItem>
    {
    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
    private Context mContext;
    private OverlayItem item;

    public MyOverlay(Drawable defaultMarker, Context context) 
    {
          super(boundCenterBottom(defaultMarker));
          mContext = context;
    }

    public void addOverlay(OverlayItem overlay) 
    {
        mOverlays.add(overlay);

    }

    public void doPopulate()
    {
         populate();
    }




    @Override
    protected OverlayItem createItem(int i) 
    { 
      return mOverlays.get(i);
    }

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

а потом в твоей деятельности ....

public void addLocations(GeoPoint _center)
{  
    final GeoPoint center = _center;

    mapOverlays = mapView.getOverlays();

    Drawable drawable = MyActivity.this.getResources().getDrawable(R.drawable.map_annotation_pin);

    itemizedoverlay = new ScoopOverlay(drawable,mContext);

//add as many points as you wish...
itemizedoverlay.addOverlay(
                    new OverlayItem(new GeoPoint(/*lon lat data here*/));
                );



showResults.sendEmptyMessage(0);
}

private Handler showResults = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) 
    { 
        itemizedoverlay.doPopulate();
        mapOverlays.add(itemizedoverlay);

        mapView.invalidate();
    }
}; 
0 голосов
/ 16 сентября 2011

Таким образом, решение состоит в том, чтобы нарисовать элемент ItemizedOverlay, содержащий элементы.

@Override
    public void draw(Canvas canvas, MapView mapView, boolean shadow) {
        super.draw(canvas, mapView, shadow);

        // cycle through all overlays
        for (int index = 0; index < mOverlays.size(); index++) {
            OverlayItemExtended item = mOverlays.get(index);

            // Converts lat/lng-Point to coordinates on the screen
            GeoPoint point = item.getPoint();
            Point ptScreenCoord = new Point();
            mapView.getProjection().toPixels(point, ptScreenCoord);



                Paint boxPaint = new Paint();
                boxPaint.setColor(android.graphics.Color.WHITE);
                boxPaint.setStyle(Paint.Style.FILL);
                boxPaint.setAlpha(140);
                canvas.drawCircle(ptScreenCoord.X, ptScreenCoord.y,
                        20, boxPaint);


        }

}
...