标记有时会在点击时改变颜色,有时不会
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
类。
【讨论】:
以上是关于标记有时会在点击时改变颜色,有时不会的主要内容,如果未能解决你的问题,请参考以下文章
转 Android RadioButton设置选中时文字和背景颜色同时改变