Android谷歌地图:最后已知位置与更新位置标记颜色未区分问题
解决Google Maps标记颜色一致的问题
我来帮你排查这个问题,咱们一步步梳理清楚:
问题根源分析
从你的代码来看,有两个关键原因导致最后已知位置和更新后的标记颜色相同:
- 最后已知位置的Marker未设置自定义颜色:在
onMapReady的else块中,创建最后已知位置的Marker时,你没有指定icon属性,所以它默认使用Google Maps Marker的红色样式。 - 位置更新的Marker颜色引用错误:在
onLocationChanged方法里,你写的HUE_YELLOW如果没有正确关联BitmapDescriptorFactory类,会导致实际使用默认红色(等同于HUE_RED),自然和最后已知位置的Marker颜色一致。 - 额外小问题:
onLocationChanged里的mMap.clear()会清除所有已添加的Marker,包括最后已知位置的那个,所以你可能根本看不到两个Marker同时存在,误以为它们颜色相同。
修复步骤
1. 给最后已知位置的Marker设置自定义颜色
修改onMapReady的else块中创建Marker的代码,给它指定一个和更新后不同的颜色(比如蓝色):
// 最后已知位置的Marker设置为蓝色 mMap.addMarker(new MarkerOptions() .position(position) .title("Last Known Location") .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)));
2. 修正位置更新Marker的颜色引用
确保onLocationChanged里的颜色常量正确引用BitmapDescriptorFactory类:
mMap.addMarker(new MarkerOptions() .position(place) .title("Updated Location") .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW)));
如果不想每次都写全称,可以在类顶部添加静态导入:
import static com.google.android.gms.maps.model.BitmapDescriptorFactory.HUE_YELLOW; import static com.google.android.gms.maps.model.BitmapDescriptorFactory.HUE_BLUE;
3. 可选:保留最后已知位置的Marker(如果需要同时显示)
如果你希望两个Marker同时存在,就删掉onLocationChanged里的mMap.clear();如果只需要显示最新位置,保留clear()即可:
@Override public void onLocationChanged(Location location) { // 移除这行,就能保留最后已知位置的Marker // mMap.clear(); LatLng place = new LatLng(location.getLatitude(), location.getLongitude()); mMap.addMarker(new MarkerOptions() .position(place) .title("Updated Location") .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW))); mMap.moveCamera(CameraUpdateFactory.newLatLng(place)); mMap.animateCamera(CameraUpdateFactory.zoomTo(3)); }
4. 额外优化:增加空指针判断
getLastKnownLocation有可能返回null,建议加个判断避免崩溃:
Location lastknownlocation=locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if(lastknownlocation != null) { LatLng position=new LatLng(lastknownlocation.getLatitude(),lastknownlocation.getLongitude()); mMap.addMarker(new MarkerOptions() .position(position) .title("Last Known Location") .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))); mMap.moveCamera(CameraUpdateFactory.newLatLng(position)); }
内容的提问来源于stack exchange,提问作者Lavish Garg
相关产品推荐
相关产品推荐

