【问题标题】:How to change the marker for the overlay on tap for android?如何更改 android 的点击覆盖标记?
【发布时间】:2011-08-12 10:11:30
【问题描述】:

我已经制作了一个应用程序,当用户单击它时,我需要在其中更改覆盖项的可绘制对象。我正在使用以下代码来实现此效果:

        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;
    }

但这似乎不起作用。每当我单击覆盖项时,它就会从视图中消失。怎么了?

更新:

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

提前谢谢你。

【问题讨论】:

  • 是否有必要在您的代码中执行此操作?在 xml 中执行此操作会简单得多。 Android 提供了一种使用 xml 定义状态可绘制对象(聚焦、按下、默认)的方法。
  • 如果您知道,能否请您详细说明一个更好的方法。
  • 会不会是你没有设置marker drawable bounds的情况?
  • @user7777.. 你能详细说明你在说什么吗?
  • 喜欢mOverlaydrawable.setBounds(imgRect);,如果您手动绘制叠加层。

标签: android android-mapview


【解决方案1】:

非常简单

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;
}

【讨论】:

  • 我不需要使地图视图无效吗?
  • 使用此代码!您忘记的主要是“setbounds”声明
  • 所以不需要map.invalidate?
  • 您似乎还没有尝试我的代码?我试过了,效果很好。只是不要忘记setbounds 声明
【解决方案2】:

我在这里看到很多答案都很难做到这一点。如果您有 2 张图像并且想要根据焦点翻转它们,请使用简单的方法:

第 1 步:将两张图片复制到 drawables 文件夹中:

示例:mycon_focused.png、mycon.png

第 2 步:在可绘制对象中创建选择器 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 可绘制对象时,使用

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

而不是

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

然后在 on tap 方法中以编程方式更改它。在阅读了许多答案并且在任何地方都没有看到这个之后,我自己尝试了一下,并且效果很好。

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

另一个注意事项:如果您使用 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());

这应该完美地居中。

【讨论】:

  • @JosephQuinsey 感谢您的编辑。下次先试试评论。我不经常看到有人直接编辑帖子(例如这篇帖子没有其他人),所以我不确定礼仪。
【解决方案3】:

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

【讨论】:

  • view1complaipolelist 是一个数组,用于对选中的标记进行分组。
  • 我看到了你给我链接的代码。我做了一个cutom overlayitem 类,但点击后覆盖的图像仍然没有改变。
  • @user590849:下载并运行我的示例项目。如果示例项目在未经修改的情况下无法正常工作,请告诉我您在什么环境中对其进行测试。如果示例项目可以正常工作,请找出您的不同之处并进行修复。
  • 好的,代码正在运行。但我不明白在调用 ontap 事件之后,您的叠加绘图如何变化?代码的哪一部分进行了更改?
  • @user590849 您需要在获得焦点时按“H”键才能切换标记
【解决方案4】:

使用 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多