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

Posted

技术标签:

【中文标题】标记有时会在点击时改变颜色,有时不会【英文标题】:Marker sometimes change colour on click and sometimes it does not 【发布时间】:2021-04-29 21:18:21 【问题描述】:

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

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

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

【问题讨论】:

请添加更多源代码:1) 带有lastClicked 声明和更改,2) getMarkerIcon() 实现。 @AndriiOmelchenko 我编辑并添加了 getMarkerIcon() 的代码。和 lastClicked 声明。 似乎您添加的代码中的所有内容都可以。尝试仔细检查标记创建部分可能是添加了相同坐标的多个标记。 @AndriiOmelchenko 非常感谢您的建议,在您发表评论后,我检查了我的列表并比较了几个标记,我发现很少有标记具有完全相同的 lat 和 lng,因此标记重叠. 【参考方案1】:

我通过检查我的标记列表解决了这个问题。从中我发现有完全相同的 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;

    

注意:Pharmacy 是具有 lat 和 lng 属性的类。

【讨论】:

【参考方案2】:

你应该试试这个

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

希望这对你有用!

【讨论】:

【参考方案3】:

可能在标记创建步骤中添加了几个具有相同坐标的标记并相互重叠。要通过坐标检查标记的存在,您可以使用Marker 对象的LatLng 作为HashMap/HashSet 键,使用O(1) 复杂性(而不是O(N) 迭代所有标记情况)方法。为此,您需要实施例如在Tomasz Nurkiewicz 的this 答案中描述的方法。比如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 类。

【讨论】:

以上是关于标记有时会在点击时改变颜色,有时不会的主要内容,如果未能解决你的问题,请参考以下文章

点击时 UITableViewCells 不会改变颜色

使 div 在单击时会在短时间内改变颜色

转 Android RadioButton设置选中时文字和背景颜色同时改变

更改触摸链接的背景颜色

当主题更改 vuetify 时,使用“辅助”组件的颜色不会改变

BUG 标记触摸时会改变颜色