自定义OverlayItem无法绘制

9
我创建了一个自定义的OverlayItem类,这样我就可以拥有一种OverlayItem类型,其Drawable标记会根据我传入的某些数据的状态而设置自己。
我试图通过在OverlayItem类中使用setMarker方法来实现这一点。但是第一次尝试失败后,我尝试重写getMarker方法,并让它返回适当的标记以表示数据。
这两种尝试都以地图上没有任何东西被绘制而结束...然而,如果它们被注释掉,则标记会正常绘制(除了它们当然使用默认标记,这不是我想要的)。
以下是我的自定义OverlayItem类代码(我尝试过的已注释掉的方法并没有起作用):
private class MyOverlayItem extends OverlayItem {
    private Context mContext;
    private MyData mData;

    public MyOverlayItem(GeoPoint point, MyData data, Context context) {
        super(point, data.getWhat(), data.getWhere());
        this.mContext = context;
        this.mData = data;

        /*if(data.getTemp() > 200)
            this.setMarker(res.getDrawable(R.drawable.icon_data_hot_l));
        else if(data.getTemp() > 100)
            this.setMarker(res.getDrawable(R.drawable.icon_data_neutral_l));
        else
            this.setMarker(res.getDrawable(R.drawable.icon_data_frozen_l));*/
    }

    /*@Override
    public Drawable getMarker(int stateBitset) {
        Resources res = this.mContext.getResources();
        if(this.mData.getTemp() > 200)
            return res.getDrawable(R.drawable.icon_data_hot_l);
        else if(this.mData.getTemp() > 100)
            return res.getDrawable(R.drawable.icon_data_neutral_l);
        return res.getDrawable(R.drawable.icon_data_frozen_l);
    }*/
}

有没有一种方法可以实现我试图做的事情...还是我需要为我的数据状态创建对应的唯一的OverlayItem类?(呃)
4个回答

4

我已经成功让标记点显示出来了,不过它们显示的是倒置的(至少我认为是这样,可能只是它们的阴影在左上角而不是右下角)。

我需要做的只是添加这一行:

this.mMarker.setBounds(0, 0, this.mMarker.getIntrinsicWidth(), this.mMarker.getIntrinsicHeight());

同时,我还需要添加这行代码来正确定位标记(当我的ItemizedOverlay添加一个棕色叠加层时,我添加了这个):

overlay.setMarker(boundCenterBottom(overlay.getMarker(0)));

2
API规定Marker需要边界才能显示...
@celestialorb 你的代码片段中任意一个都能完成任务(或者我的代码片段也一样可以用)当你单独使用setBounds()时,它可以实现你想要的...你的标记的边框被设置。关于覆盖物项点和标记的阴影状态等都默认设置(我没有查过,但它们不是我想要的...) :)
mOverlay.setMarker(boundCenterBottom(mOverlay.getMarker(0))); 可以为您完成所有工作,设置边界并使标记底部居中于该点上(因此取了这个时髦的方法名)。
至于最佳实践,比我聪明的人将会给出建议...

1

1
尝试重写您的叠加类的onDraw()方法。

1
你是指draw(...)方法吗?那似乎会太复杂,而且绕了一个大弯。文档中指出:“通过OverlayItem.getMarker(int)方法,可以为项目提供替代标记。如果该方法返回null,则使用默认标记。”,所以我应该能够重写getMarker方法并让它绘制不同的标记,对吧? - celestialorb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接