在Android OverlayItem中使用自定义可绘制项时出现绘图位置问题

在Android OverlayItem中使用自定义可绘制项时出现绘图位置问题,android,location,marker,overlayitem,Android,Location,Marker,Overlayitem,此代码正在使用 谷歌API(第8级) 当我更新OverlayItem以使用自定义可绘制画布时 对象似乎在错误的位置绘制像素。在这个 我试图在路易斯安那州画一个圆圈。查看 整个地图圆是从地图上画出来的。当你放大到新的 奥尔良你会看到圆圈接近合适的纬度 经度。热点似乎在正确的位置,不是吗 画圆的地方 如果在draw方法中,画布还原方法称为圆 在正确的位置绘制 此外,如果未使用自定义绘图,则会在中绘制图标 正确的位置(不使用画布“还原”) 下面是显示此行为的代码。我试着加上“挫折” 还有“boundC

此代码正在使用 谷歌API(第8级)

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

如果在draw方法中,画布还原方法称为圆 在正确的位置绘制

此外,如果未使用自定义绘图,则会在中绘制图标 正确的位置(不使用画布“还原”)

下面是显示此行为的代码。我试着加上“挫折” 还有“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;
    }
}
=======================================================================
=======================================================================
公共类MapsActivity扩展了MapActivity
{
/**在首次创建活动时调用*/
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MapView MapView=(MapView)findViewById(R.id.MapView);
mapView.SetBuilTinZoomControl(真);
//逐项覆盖
List mapOverlays=mapView.getOverlays();
可绘制默认图标=
this.getResources().getDrawable(R.drawable.icon);
MyItemizedOverlay itemizedoverlay=新建
MyItemizeOverlay(默认图标,该图标);
//覆盖项
地质点pt=新的地质点(30000000,-90000000);
OverlayItem项目=新OverlayItem(pt,“新奥尔良”,
“路易斯安那州”);
//定制可拉伸
CustomDrawable CustomDrawable=新的CustomDrawable(pt,
地图视图);
布尔showProblem=true;
如果(显示问题)
{
item.setMarker(可定制绘图);
}
其他的
{
item.setMarker(默认图标);
}
//添加我们要覆盖的项目
itemizedoverlay.addOverlay(item);
//添加覆盖层
添加(itemizedoverlay);
}
受保护的布尔值isRouteDisplayed()
{
返回false;
}
}
=======================================================================
公共类MyItemizeOverlay扩展了ItemizeOverlay
{
private ArrayList mOverlays=new
ArrayList();
私有上下文;
公共MyItemizeOverlay(可绘制的defaultMarker,上下文)
{
super(boundCenterBottom(defaultMarker));
mContext=上下文;
}
公共void addOverlay(OverlayItem项)
{
添加(项目);
填充();
}
公共无效移除覆盖(覆盖项项)
{
移除(项目);
}
公共void removeOverlay(int项)
{
移除(项目);
}
受保护的OverlayItem createItem(int i)
{
OverlayItem item=mOverlays.get(i);
Drawable Drawable=item.getMarker(0);
如果(可绘制!=null)
{
int w=drawable.getIntrinsicWidth();
inth=drawable.getIntrinsicHeight();
拉深立根(0,0,w,h);
项目.设置标记(boundCenterBottom(可绘制));
}
退货项目;
}
public void draw(android.graphics.Canvas画布、MapView MapView、,
布尔阴影)
{
如果(阴影)
返回;
super.draw(画布、地图视图、阴影);
}
公共整数大小()
{
返回mOverlays.size();
}
受保护的布尔onTap(整数索引)
{
OverlayItem item=mOverlays.get(索引);
AlertDialog.Builder对话框=新建
AlertDialog.Builder(mContext);
setTitle(item.getTitle());
setMessage(item.getSnippet());
dialog.show();
返回true;
}
}
=======================================================================
公共类CustomDrawable扩展ShapeDrawable
{
私有整数半径=10;
专用地质点=空;
私有MapView MapView=null;
公共自定义绘图(地质点、地图视图、地图视图)
{
这个点=点;
this.mapView=mapView;
}
公共空白绘制(画布)
{
//这样做(多少)修复了投影问题?
//canvas.restore();
Projection=mapView.getProjection();
点pt=投影。toPixels(点,空);
帆布画圆(x点,y点,半径,
getPaint());
}
public int getIntrinsicHeight()
{
返回2*半径;
}
public int getIntrinsicWidth()
{
返回2*半径;
}
}
=======================================================================

您的
可自定义绘图
不应相对于地图定位自身。它应该只在其边界内绘制自身,而不引用
地图视图
或其
投影
ItemizedOverlay
负责为您的
OverlayItem

定位
draawable
,作为旁白,我试图表示在地理空间中实际定义的形状(纬度和经度值)。所以我想我需要一种将地理坐标映射到“标记”空间的方法。你应该通过点击空心复选框来接受Jason的答案。谢谢。这非常有效。我从OSM开始编写代码,没有意识到OverlayItem中的标记不需要使用projection类。再次感谢!