我有一个应用程序,我在谷歌地图上显示附近药店的标记。当我单击标记时,我希望标记更改颜色。当我单击其他标记时,它应该将之前标记的颜色更改为默认颜色,并将更改新标记的颜色。这是随机工作的,我的意思是有时标记颜色会发生变化,有时它会保持默认颜色。
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)));
它正在编译,但有时它不会改变标记的颜色。
可能在标记创建步骤中添加了几个具有相同坐标并相互重叠的标记。要通过坐标检查标记是否存在,您可以使用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
类。
你应该试试这个
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)));
希望这对你有用!
我通过查看标记列表解决了这个问题。从这一点上,我发现有完全相同的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
如果你点击按钮,你会看到一个蓝色的边框,这对我来说真的很烦。对于如何让它消失/根本不出现,你有什么解决方案吗?