当前位置: 首页 > 知识库问答 >
问题:

标记有时会在单击时改变颜色,有时则不会

阴雪风
2023-03-14

我有一个应用程序,我在谷歌地图上显示附近药店的标记。当我单击标记时,我希望标记更改颜色。当我单击其他标记时,它应该将之前标记的颜色更改为默认颜色,并将更改新标记的颜色。这是随机工作的,我的意思是有时标记颜色会发生变化,有时它会保持默认颜色。

Marker lastClicked;

public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    // Add a marker in user's location
    // User's location is taken from the postal code entered


    mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
        @Override
        public boolean onMarkerClick(Marker marker) {
            if(lastClicked != null){
                lastClicked.setIcon(BitmapDescriptorFactory.defaultMarker());
            }
            marker.setIcon(getMarkerIcon(getResources().getColor(R.color.app_color)));

            lastClicked=marker;
            return false;
        }
    });
}

getMarkerIcon()方法的代码是:

public BitmapDescriptor getMarkerIcon(int color){
    float[] hsvFloat = new float[3];
    Color.colorToHSV(color, hsvFloat);
    return BitmapDescriptorFactory.defaultMarker(hsvFloat[0]);
}

注意:我在每一行中都添加了调试器,以查看代码的哪些部分没有运行,奇怪的是,当调试器出现在这一行时

marker.setIcon(getMarkerIcon(getResources().getColor(R.color.app_color)));

它正在编译,但有时它不会改变标记的颜色。

共有3个答案

翁翰墨
2023-03-14

可能在标记创建步骤中添加了几个具有相同坐标并相互重叠的标记。要通过坐标检查标记是否存在,您可以使用O(1)复杂性(而不是O(N)来迭代所有标记大小写)方法,方法是使用Marker对象的LatLng作为HashMap/HashSet键。为此,您需要实现所描述的方法,例如,在Tomasz Nurkiewicz的这个答案中。例如,Key类可以是这样的:

public class LatLngKey {
    private LatLng mLatLng;

    public LatLngKey(LatLng latLng) {
        mLatLng = latLng;
    }

    public double getLattitude() {
        return mLatLng.latitude;
    }

    public double getLongitude() {
        return mLatLng.longitude;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof LatLngKey)) return false;
        LatLngKey key = (LatLngKey) o;
        return mLatLng.latitude == key.getLattitude() && mLatLng.longitude == key.getLongitude();
    }

    @Override
    public int hashCode() {
        // for better accuracy it is needed to convert double values into integer 
        int result = (int) mLatLng.latitude * 10_000;
        result = 31 * result + (int) mLatLng.longitude * 10_000;
        return result;
    }
}

这样使用它:

...
mGoogleMap = googleMap;

Map<LatLngKey, Marker> markersMap = new HashMap<>();
LatLng positionNoida = new LatLng(28.57, 77.32);
Marker markerNoida = mGoogleMap.addMarker(new MarkerOptions().position(positionNoida)
        .title("Marker in Noida"));
LatLngKey markerKey = new LatLngKey(markerNoida.getPosition());
markersMap.put(markerKey, markerNoida);

LatLng positionNoida2 = new LatLng(28.57, 77.32);
Marker markerNoida2 = mGoogleMap.addMarker(new MarkerOptions().position(positionNoida2)
        .title("Marker in Noida 2"));
LatLngKey markerKey2 = new LatLngKey(markerNoida2.getPosition());

if (markersMap.containsKey(markerKey2)) {
    // marker with same coordinates exists 
    ...
} else {
    // marker with same coordinates do not exists 
    ...
}
...

您需要为您的Pharmacy实现PharmacyKey类。

章昱
2023-03-14

你应该试试这个

googlemap.addMarker(new MarkerOptions()
.position(new LatLng( 65.07213,-2.109375))
.title("This is my title")
.snippet("and snippet")
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE)));

希望这对你有用!

闻人业
2023-03-14

我通过查看标记列表解决了这个问题。从这一点上,我发现有完全相同的lat和lng标记,这就是标记重叠的原因,这意味着一个标记上有超过1个标记

 public boolean isDuplicate(Pharmacy pharmacy){

        for(int i=0; i<pharmacyList.size(); i++){

            if(pharmacyList.get(i).getLatitude() == pharmacy.getLatitude()

                    &&pharmacyList.get(i).getLongitude() == pharmacy.getLongitude())

                return true;

        }

        return false;

    }

注:药剂是lat和lng属性的类别。

 类似资料:
  • 有没有一种方法可以随意改变本地传单中的标记颜色?我使用的是svg元素,可以进行样式化。我知道使用Mapbox.js是可能的 编辑:为了澄清我打算做的:如果你通过双击或其他方式向地图添加标记,它应该有随机的颜色。为了实现这一点,我想使用svg图标来对标记进行样式化。 这是我的代码:

  • 下图显示了一个问题。 正常状态 当背景颜色改为白色时,我的图标不会只改为黑色

  • 我试图在点击时更改标记的图标编号。我使用的是角度谷歌地图。我正在使用本地资产文件夹而不是服务API设置iNurl。 单击标记时,如何更改上述图标。

  • 我使用的是Eclipse Color Theme插件。 当我更改主题时,除了.等之外,所有的颜色都改变了。 它们保持黑色,而当我试图使用深色主题时,这使得事情变得困难。 问题是在使用Groovy时没有正确设置语法颜色。 这解决了问题

  • 只是尝试在CSS中练习悬停和下拉。在下面的代码中,我希望每当下拉子div(带有Home1文本的绿色div)悬停在上面时,的背景色(红色)应该更改为蓝色。 会很感激你的帮助。 null null

  • 如果你点击按钮,你会看到一个蓝色的边框,这对我来说真的很烦。对于如何让它消失/根本不出现,你有什么解决方案吗?