我一直在寻找关于扩展 ItemizedOverlay 和 OverlayItem 的正确方法的明确信息,但我得到的结果还不能让我满意。简而言之,我需要在地图上显示与多个位置相关的不同类型的标记;要显示的标记类型由位置本身的特定属性决定。当标记被选中时,我还需要显示某个标记,当标记未选中或未聚焦时,我还需要显示另一个标记。据我了解,这是我写的:
public class MyItemizedOverlay extends ItemizedOverlay<MyOverlayItem> {
ArrayList<MyOverlayItem> items;
//...
public MyItemizedOverlay(Drawable drawable, /*...*/) {
super(boundCenterBottom(drawable));
//...
populate();
}
public void addOverlay(MyOverlayItem overlay) {
return this.items.add(overlay);
populate();
@Override
protected MyOverlayItem createItem(int index) {
return this.items.get(index);
}
@Override
public int size() {
return this.items.size();
}}
public class MyOverlayItem extends OverlayItem {
//...
public Drawable getMarker(int stateBitset) {
Drawable drawable;
try {
if (stateBitset == 0) {
if (this.property.Equals("ON")) {
drawable = this.context.getResources().getDrawable(R.drawable.on);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
return drawable;
} else if (this.property.Equals("OFF")) {
drawable = this.context.getResources().getDrawable(R.drawable.off);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
return drawable;
} else {
drawable = this.context.getResources().getDrawable(R.drawable.generic);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
return drawable;
}
} else {
//same thing as above, just with different drawables.
}
} catch (Exception e) {
//...
}
return null;
}
MyItemizedOverlay 由主 MapActivity 中的 MyOverlayItem 创建和填充。现在:正确放置的唯一标记是默认标记。也就是说,传递给 MyItemizedOverlay 的构造函数的那些具有可绘制性,并使用 boundCenterBottom 设置(将图像的中间底部点设置为指向地图中的指定点)。当 MyOverlayItem 类中的 getMarker 方法不返回 null,并且使用了另一个标记时,图像显示错误(例如,阴影不跟随图像!)。在getMarker方法中,你必须为drawable定义一个边界框(用drawable.setBounds);但是我认为,通过这种方式,您没有指定必须放置在地图点中的点。
因此,问题是:对于从 OverlayItem 对象的 getMarker 方法返回到 ItemizedOverlay 的标记可绘制对象,如何指定用于放置在地图中的边界(与默认可绘制对象的 MyItemizedOverlay 中的 boundCenterBottom 一样)? 最好的方法是什么?
;)