如何更改Android的叠加标记?

时间:2011-08-12 10:11:30

标签: android android-mapview

我已经制作了一个应用程序,当用户点击它时,我需要更改overlayitem的drawable。我正在使用以下代码来实现此效果:

        protected boolean onTap(int index) {
        OverlayItem item = mOverlays.get(index);
        if(item.getTitle().equals("true")){
            if(item.getMarker(OverlayItem.ITEM_STATE_FOCUSED_MASK).equals(greenMarker)){
                item.setMarker(orangeMarker);
                view1ComplainPoleList.add(item.getSnippet());
                Log.i("adding",item.getSnippet());
                map.invalidate();
            }
            else{
                item.setMarker(greenMarker);
                view1ComplainPoleList.remove(item.getSnippet());
                Log.i("removing",item.getSnippet());
                map.invalidate();
            }
        }
        return true;
    }

但这似乎不起作用。每当我点击一个overlayitem它就会从视图中消失。出了什么问题?

更新:

你能告诉我如何在滚动地图时加载新视图......?

提前谢谢。

4 个答案:

答案 0 :(得分:13)

非常简单

protected boolean onTap(int index) {
    OverlayItem item = mOverlays.get(index);
    //Get the new Drawable
    Drawable marker = mContext.getResources().getDrawable(R.drawable.icon);
    //Set its bounds
    marker.setBounds(0,0,marker.getIntrinsicWidth(),marker.getIntrinsicHeight());
    //Set the new marker
    item.setMarker(marker);
    //Return true! Do not invalidate
    return true;
}

答案 1 :(得分:3)

我在这里看到很多答案。如果您有2张图像并且想要根据焦点进行翻转,请按以下方式进行操作:

步骤1:将两个图像复制到drawables文件夹中:

示例:mycon_focused.png,mycon.png

步骤2:在drawables中创建选择器xml文件:示例“marker.xml”

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:state_focused="true" android:drawable="@drawable/mycon_focused"/>
     <item android:state_focused="false" android:drawable="@drawable/mycon" />
</selector>

步骤3:当您创建ItemOverlay并添加OverlayItems drawable时,请使用

getResources().getDrawable(R.drawable.marker);

而不是

getResources().getDrawable(R.drawable.mycon);

然后在点击方法中以编程方式更改它。在阅读了许多答案而没有在任何地方看到这一点之后我自己就尝试了它,它完美地运作了。

非常感谢以前的贡献者,如果没有你的帮助,我就不会有一个起点。

另一个注意事项:如果您正在使用Sherif elKhatib建议的代码并且您的标记位置已关闭,请尝试:

int width = marker.getIntrinsicWidth();
int height = marker.getIntrinsicHeight();
marker.setBounds(-(width/2),-height,(width/2),0);

而不是

marker.setBounds(0,0,marker.getIntrinsicWidth(),marker.getIntrinsicHeight());

这应该是完美的中心。

答案 2 :(得分:2)

我不知道view1ComplainPoleList是什么以及是否影响了问题。我通过继承OverlayItem并覆盖getMarker()来处理此问题,以返回正确的图像。 Here is the sample project我使用这种技术。

答案 3 :(得分:2)

使用Setbounds api设置界限,如下所示:编辑原始代码

protected boolean onTap(int index) {
    OverlayItem item = mOverlays.get(index);
    if(item.getTitle().equals("true")){
        if(item.getMarker(OverlayItem.ITEM_STATE_FOCUSED_MASK).equals(greenMarker)){
            orangeMarker.setBounds(0,0,orangeMarker.getIntrinsicWidth(),orangeMarker.getIntrinsicHeight());
            item.setMarker(orangeMarker);
            view1ComplainPoleList.add(item.getSnippet());
            Log.i("adding",item.getSnippet());
            map.invalidate();
        }
        else{
            greenMarker.setBounds(0,0,greenMarker.getIntrinsicWidth(),greenMarker.getIntrinsicHeight());
            item.setMarker(greenMarker);
            view1ComplainPoleList.remove(item.getSnippet());
            Log.i("removing",item.getSnippet());
            map.invalidate();
        }
    }
    return true;
}