在Android OverlayItem中使用自定义可绘制项时出现绘图位置问题
此代码正在使用 谷歌API(第8级) 当我更新OverlayItem以使用自定义可绘制画布时 对象似乎在错误的位置绘制像素。在这个 我试图在路易斯安那州画一个圆圈。查看 整个地图圆是从地图上画出来的。当你放大到新的 奥尔良你会看到圆圈接近合适的纬度 经度。热点似乎在正确的位置,不是吗 画圆的地方 如果在draw方法中,画布还原方法称为圆 在正确的位置绘制 此外,如果未使用自定义绘图,则会在中绘制图标 正确的位置(不使用画布“还原”) 下面是显示此行为的代码。我试着加上“挫折” 还有“boundCenterBottom”,因为其他人似乎表示 解决了他们的“错误位置”问题。虽然 老实说,我不知道为什么需要这些电话在Android OverlayItem中使用自定义可绘制项时出现绘图位置问题,android,location,marker,overlayitem,Android,Location,Marker,Overlayitem,此代码正在使用 谷歌API(第8级) 当我更新OverlayItem以使用自定义可绘制画布时 对象似乎在错误的位置绘制像素。在这个 我试图在路易斯安那州画一个圆圈。查看 整个地图圆是从地图上画出来的。当你放大到新的 奥尔良你会看到圆圈接近合适的纬度 经度。热点似乎在正确的位置,不是吗 画圆的地方 如果在draw方法中,画布还原方法称为圆 在正确的位置绘制 此外,如果未使用自定义绘图,则会在中绘制图标 正确的位置(不使用画布“还原”) 下面是显示此行为的代码。我试着加上“挫折” 还有“boundC
=======================================================================
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类。再次感谢!