Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android GoogleMaps:自定义ItemizeOverlay和OverlayItem,显示不同标记的正确方式_Android_Google Maps_Itemizedoverlay_Overlayitem - Fatal编程技术网

Android GoogleMaps:自定义ItemizeOverlay和OverlayItem,显示不同标记的正确方式

Android GoogleMaps:自定义ItemizeOverlay和OverlayItem,显示不同标记的正确方式,android,google-maps,itemizedoverlay,overlayitem,Android,Google Maps,Itemizedoverlay,Overlayitem,我一直在寻找关于扩展ItemizedOverlay和OverlayItem的正确方法的清晰信息,但是我得到的结果还不能让我满意。 简单地说,我需要在地图上显示与许多位置相关的不同类型的标记;要显示的标记类型由位置本身的特定属性决定。当一个标记被选中时,我还需要显示一个特定的标记,当该标记未被选中或未聚焦时,我还需要显示另一个标记。 据我了解,这是我写的: public class MyItemizedOverlay extends ItemizedOverlay<MyOverlayItem

我一直在寻找关于扩展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;
}
公共类MyItemizeOverlay扩展了ItemizeOverlay{
数组列表项;
//...
公共MyItemizedOverlay(可绘图,/*…*/){
超级(可拉伸);
//...
填充();
}
公共无效添加覆盖(MyOverlayItem覆盖){
返回此.items.add(覆盖);
填充();
@凌驾
受保护的MyOverlayItem createItem(int索引){
返回此.items.get(索引);
}
@凌驾
公共整数大小(){
返回此.items.size();
}}
公共类MyOverlayItem扩展了OverlayItem{
//...
公共可绘制getMarker(int stateBitset){
可拉伸;
试一试{
if(stateBitset==0){
if(this.property.Equals(“ON”)){
drawable=this.context.getResources().getDrawable(R.drawable.on);
setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
回拉;
}else if(this.property.Equals(“OFF”)){
drawable=this.context.getResources().getDrawable(R.drawable.off);
setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
回拉;
}否则{
drawable=this.context.getResources().getDrawable(R.drawable.generic);
setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
回拉;
}
}否则{
//和上面一样,只是不同的抽绳。
}
}捕获(例外e){
//...
}
返回null;
}
MyItemizedOverlay在主MapActivity中创建并填充MyOverlayItem。现在: 唯一正确放置的标记是默认标记。也就是说,将传递给MyItemizedOverlay构造函数的标记作为可绘制标记,并使用boundCenterBottom(将图像的中间底点设置为指向地图中的指定点)进行设置的标记。当MyOverlayItem类中的getMarker方法不返回null,并且使用了另一个标记时,图像显示错误(例如,阴影不在图像后面!)。在getMarker方法中,必须为可绘制对象定义边界框(使用drawable.setBounds);但我认为,通过这种方式,您没有指定必须放置在地图点中的点

因此,问题是:对于从OverlayItem对象的getMarker方法返回到ItemizedOverlay的marker drawable,如何指定用于放置在地图中的边界(如默认drawable的MyItemizedOverlay中的boundCenterBottom所做的),以及最好的方法是什么


好的,经过反复测试,似乎:

drawable.setBounds(-drawable.getIntrinsicWidth()/2, -drawable.getIntrinsicHeight(), drawable.getIntrinsicWidth() /2, 0);
放置在OverlayItem的getMarker方法中,对于必须返回的可绘制文件,执行此操作(就像boundBottomCenter在ItemizeOverlay中所做的那样)。现在一切正常,甚至非默认标记也正确显示

干杯