【问题标题】:Problem with drawing location using a custom Drawable in an Android OverlayItem在 Android OverlayItem 中使用自定义 Drawable 绘制位置的问题
【发布时间】:2011-02-15 11:44:29
【问题描述】:

此代码正在使用 Google API(第 8 级)。

当我更新 OverlayItem 以使用自定义可绘制对象时,Canvas 对象似乎在错误的位置绘制像素。在这个 例如我想在路易斯安那州画一个圆圈。查看时 整个地图 圆圈是从地图上画出来的。当你放大新 奥尔良,您会看到圆圈接近适当的纬度,并且 经度。热点似乎在正确的位置,没有 不管画圈的地方。

如果,在draw方法中,canvas restore方法被称为circle 绘制在正确的位置。

另外,如果不使用自定义drawable,图标会绘制在 正确的位置(不使用画布“恢复”)。

以下是显示此行为的代码。我尝试添加“setBounds” 和“boundCenterBottom”,因为其他人似乎表明 解决了他们的“位置错误”问题。尽管 老实说,我不确定为什么需要这些电话。

=======================================================================
public class MapsActivity extends MapActivity
{
    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        MapView mapView = (MapView) findViewById(R.id.mapView);
        mapView.setBuiltInZoomControls(true);

        // Itemized Overlay
        List<Overlay> mapOverlays = mapView.getOverlays();
        Drawable defaultIcon =
this.getResources().getDrawable(R.drawable.icon);
        MyItemizedOverlay itemizedoverlay = new
MyItemizedOverlay(defaultIcon, this);

        // Overlay Item
        GeoPoint pt = new GeoPoint(30000000, -90000000);
        OverlayItem item = new OverlayItem(pt,"New Orleans",
"Louisiana");

        // Custom Drawable
        CustomDrawable customDrawable = new CustomDrawable(pt,
mapView);

        boolean showProblem = true;
        if (showProblem)
        {
            item.setMarker(customDrawable);
        }
        else
        {
            item.setMarker(defaultIcon);
        }

        // Add item we want to overlay
        itemizedoverlay.addOverlay(item);

        // Add overlay
        mapOverlays.add(itemizedoverlay);
    }

    protected boolean isRouteDisplayed()
    {
        return false;
    }
}
=======================================================================
public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem>
{
    private ArrayList<OverlayItem> mOverlays = new
ArrayList<OverlayItem>();

    private Context mContext;

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

    public void addOverlay(OverlayItem item)
    {
        mOverlays.add(item);
        populate();
    }

    public void removeOverlay(OverlayItem item)
    {
        mOverlays.remove(item);
    }

    public void removeOverlay(int item)
    {
        mOverlays.remove(item);
    }

    protected OverlayItem createItem(int i)
    {
        OverlayItem item = mOverlays.get(i);
        Drawable drawable = item.getMarker(0);

        if (drawable != null)
        {
            int w = drawable.getIntrinsicWidth();
            int h = drawable.getIntrinsicHeight();

            drawable.setBounds(0, 0, w, h);

            item.setMarker(boundCenterBottom(drawable));
        }

        return item;
    }

    public void draw(android.graphics.Canvas canvas, MapView mapView,
            boolean shadow)
    {
        if (shadow)
            return;

        super.draw(canvas, mapView, shadow);
    }

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

    protected boolean onTap(int index)
    {
        OverlayItem item = mOverlays.get(index);
        AlertDialog.Builder dialog = new
AlertDialog.Builder(mContext);
        dialog.setTitle(item.getTitle());
        dialog.setMessage(item.getSnippet());
        dialog.show();

        return true;
    }
}

=======================================================================
public class CustomDrawable extends ShapeDrawable
{
    private int radius = 10;
    private GeoPoint point = null;
    private MapView mapView = null;

    public CustomDrawable(GeoPoint point, MapView mapView)
    {
        this.point  = point;
        this.mapView  = mapView;
    }

    public void draw(Canvas canvas)
    {
        // TODO This (somewhat) fixes projection problem?
        //canvas.restore();

        Projection projection = mapView.getProjection();

        Point pt = projection.toPixels(point, null);

        canvas.drawCircle(pt.x, pt.y, radius,
getPaint());
    }

    public int getIntrinsicHeight()
    {
        return 2 * radius;
    }

    public int getIntrinsicWidth()
    {
        return 2 * radius;
    }
}
=======================================================================

【问题讨论】:

  • 顺便说一句,我试图表示在 GEO 空间中实际定义的形状(纬度和经度值)。所以我想我需要一种将 GEO 坐标映射到“标记”空间的方法。
  • 您应该通过单击空心检查来接受 Jason 的回答。

标签: android location marker overlayitem


【解决方案1】:

您的CustomDrawable 不应该相对于地图进行定位。它应该只在其范围内绘制自己,而不是引用MapView 或其ProjectionItemizedOverlay 负责为您的 OverlayItem 定位 Drawable

【讨论】:

  • 谢谢。那工作得很好。我用 OSM 开始代码,并没有意识到 OverlayItem 内的标记不需要使用投影类。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多