Android映射utils集群图标颜色 [英] Android maps utils cluster icon color
问题描述
是否有任何方法可以更改群集项目的背景颜色? (显示标记计数的标记,例如100+,200+ ...)。我试图查看ClusterManager的源代码,但找不到任何改变颜色的选项,但也许这里有人知道如何做到这一点。我基本上想要实现这些颜色。
我能够通过使用 this演示作为指导。
我使用Material Design中的镜头
图标来自此处的图标。在下载镜头
zip后,我在可绘制文件夹下放置 ic_lens_black_24dp.png
。然后我使用 Drawable.setColorFilter()方法来更改代码中的默认颜色。
我也能够更改默认的Marker颜色,首先,通过调用 setRenderer()
来设置一个Renderer:$ / code $:
mClusterManager.setRenderer(new MyClusterRenderer(this,mMap,
mClusterManager));
然后,定义 MyClusterRenderer
class:
public class MyClusterRenderer extends DefaultClusterRenderer< MyItem> {
private final IconGenerator mClusterIconGenerator = new IconGenerator(getApplicationContext());
public MyClusterRenderer(Context context,GoogleMap map,
ClusterManager< MyItem> clusterManager){
super(context,map,clusterManager);
$ b @Override
protected void onBeforeClusterItemRendered(MyItem item,
MarkerOptions markerOptions){
BitmapDescriptor markerDescriptor = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory .HUE_MAGENTA);
markerOptions.icon(markerDescriptor);
}
@Override
protected void onClusterItemRendered(MyItem clusterItem,Marker marker){
super.onClusterItemRendered(clusterItem,marker);
$ b $覆盖
保护无效onBeforeClusterRendered(集群< MyItem>集群,MarkerOptions markerOptions){
最终Drawable clusterIcon = getResources()。getDrawable (R.drawable.ic_lens_black_24dp);
clusterIcon.setColorFilter(getResources()。getColor(android.R.color.holo_orange_light),PorterDuff.Mode.SRC_ATOP);
mClusterIconGenerator.setBackground(clusterIcon);
//修改一位或两位数字的填充符
if(cluster.getSize()<10){
mClusterIconGenerator.setContentPadding(40,20,0,0) ;
}
else {
mClusterIconGenerator.setContentPadding(30,20,0,0);
}
位图图标= mClusterIconGenerator.makeIcon(String.valueOf(cluster.getSize()));
markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
完整课程代码:
public class MapsActivity扩展AppCompatActivity
实现ClusterManager.OnClusterItemInfoWindowClickListener< MyItem> {
私人ClusterManager< MyItem> mClusterManager;
私人MyItem clickedClusterItem;
私有GoogleMap mMap;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
setUpMapIfNeeded();
@Override
protected void onResume(){
super.onResume();
setUpMapIfNeeded();
private void setUpMapIfNeeded(){
//做一个空检查来确认我们还没有实例化地图。
if(mMap == null){
//尝试从SupportMapFragment获取映射。
mMap =((SupportMapFragment)getSupportFragmentManager()。findFragmentById(R.id.map))
.getMap();
//检查我们是否成功获取地图。
if(mMap!= null){
setUpMap();
$ b private void setUpMap(){
mMap.getUiSettings()。setMapToolbarEnabled(true );
mMap.getUiSettings()。setZoomControlsEnabled(true);
mMap.setMyLocationEnabled(true);
mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
mClusterManager =新的ClusterManager<>(this,mMap);
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(37.779977,-122.413742),10));
mMap.setOnCameraChangeListener(mClusterManager);
mMap.setOnMarkerClickListener(mClusterManager);
mClusterManager.setRenderer(new,MyClusterRenderer(this,mMap,
mClusterManager));
mMap.setInfoWindowAdapter(mClusterManager.getMarkerManager());
mMap.setOnInfoWindowClickListener(mClusterManager); //添加
mClusterManager.setOnClusterItemInfoWindowClickListener(this); //添加
mClusterManager
.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener< MyItem>(){
@Override
public boolean onClusterItemClick(MyItem item){
clickedClusterItem = item;
return false;
}
});
addItems();
mClusterManager.getMarkerCollection()。setOnInfoWindowAdapter(
MyCustomAdapterForItems());
private void addItems(){
double latitude = 37.779977;
double longitude = -122.413742;
for(int i = 0; i <10; i ++){
double offset = i / 60d;
double lat = latitude + offset;
double lng = longitude + offset;
MyItem offsetItem = new MyItem(lat,lng,title+ i + 1,snippet+ i + 1);
mClusterManager.addItem(offsetItem);
$ b //加上编辑
@Override
public void onClusterItemInfoWindowClick(MyItem myItem){
//集群项目InfoWindow单击,将标题设置为操作
意图i =新意图(this,OtherActivity.class);
i.setAction(myItem.getTitle());
startActivity(i);
//你可能想为每个InfoWindow做不同的事情:
if(myItem.getTitle()。equals(some title)){
//做一些特定于这个InfoWindow的事情......
}
}
public class MyCustomAdapterForItems implements GoogleMap.InfoWindowAdapter {
private final查看myContentsView;
MyCustomAdapterForItems(){
myContentsView = getLayoutInflater()。inflate(
R.layout.info_window,null);
}
@Override
public View getInfoWindow(Marker marker){
TextView tvTitle =((TextView)myContentsView
.findViewById(R.id。 txtTitle));
TextView tvSnippet =((TextView)myContentsView
.findViewById(R.id.txtSnippet));
tvTitle.setText(clickedClusterItem.getTitle());
tvSnippet.setText(clickedClusterItem.getSnippet());
返回myContentsView;
}
@Override
public View getInfoContents(Marker marker){
return null;
}
}
公共类MyClusterRenderer扩展了DefaultClusterRenderer< MyItem> {
private final IconGenerator mClusterIconGenerator = new IconGenerator(getApplicationContext());
public MyClusterRenderer(Context context,GoogleMap map,
ClusterManager< MyItem> clusterManager){
super(context,map,clusterManager);
$ b @Override
protected void onBeforeClusterItemRendered(MyItem item,
MarkerOptions markerOptions){
BitmapDescriptor markerDescriptor = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory .HUE_MAGENTA);
markerOptions.icon(markerDescriptor);
}
@Override
protected void onClusterItemRendered(MyItem clusterItem,Marker marker){
super.onClusterItemRendered(clusterItem,marker);
$ b $覆盖
保护无效onBeforeClusterRendered(集群< MyItem>集群,MarkerOptions markerOptions){
最终Drawable clusterIcon = getResources()。getDrawable (R.drawable.ic_lens_black_24dp);
clusterIcon.setColorFilter(getResources()。getColor(android.R.color.holo_orange_light),PorterDuff.Mode.SRC_ATOP);
mClusterIconGenerator.setBackground(clusterIcon);
//修改一位或两位数字的填充符
if(cluster.getSize()<10){
mClusterIconGenerator.setContentPadding(40,20,0,0) ;
}
else {
mClusterIconGenerator.setContentPadding(30,20,0,0);
}
位图图标= mClusterIconGenerator.makeIcon(String.valueOf(cluster.getSize()));
markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
}
}
}
结果:
初次应用推出:
再次缩小,所有标记聚集在一起:
Is there any method to change the background color of the cluster item? (the one that displays the count of the markers, like 100+, 200+ ...). I tried to look into the source code of the ClusterManager but could not find any option to change the color, but maybe someone here knows how to do that. I basically want to "materialify" those colors a bit.
I was able to get a rough implementation working by using this demo from the library samples as a guide.
I used the lens
icon from the Material Design Icons from here. After downloading the lens
zip I put ic_lens_black_24dp.png
under the drawable folder. Then I used the Drawable.setColorFilter() method to change the default color in the code.
I was also able to change the default Marker color, and figured I would include that as well here.
First, set a Renderer by calling setRenderer()
:
mClusterManager.setRenderer(new MyClusterRenderer(this, mMap,
mClusterManager));
Then, define the MyClusterRenderer
class:
public class MyClusterRenderer extends DefaultClusterRenderer<MyItem> {
private final IconGenerator mClusterIconGenerator = new IconGenerator(getApplicationContext());
public MyClusterRenderer(Context context, GoogleMap map,
ClusterManager<MyItem> clusterManager) {
super(context, map, clusterManager);
}
@Override
protected void onBeforeClusterItemRendered(MyItem item,
MarkerOptions markerOptions) {
BitmapDescriptor markerDescriptor = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA);
markerOptions.icon(markerDescriptor);
}
@Override
protected void onClusterItemRendered(MyItem clusterItem, Marker marker) {
super.onClusterItemRendered(clusterItem, marker);
}
@Override
protected void onBeforeClusterRendered(Cluster<MyItem> cluster, MarkerOptions markerOptions){
final Drawable clusterIcon = getResources().getDrawable(R.drawable.ic_lens_black_24dp);
clusterIcon.setColorFilter(getResources().getColor(android.R.color.holo_orange_light), PorterDuff.Mode.SRC_ATOP);
mClusterIconGenerator.setBackground(clusterIcon);
//modify padding for one or two digit numbers
if (cluster.getSize() < 10) {
mClusterIconGenerator.setContentPadding(40, 20, 0, 0);
}
else {
mClusterIconGenerator.setContentPadding(30, 20, 0, 0);
}
Bitmap icon = mClusterIconGenerator.makeIcon(String.valueOf(cluster.getSize()));
markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
}
}
Full class code:
public class MapsActivity extends AppCompatActivity
implements ClusterManager.OnClusterItemInfoWindowClickListener<MyItem> {
private ClusterManager<MyItem> mClusterManager;
private MyItem clickedClusterItem;
private GoogleMap mMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
setUpMapIfNeeded();
}
@Override
protected void onResume() {
super.onResume();
setUpMapIfNeeded();
}
private void setUpMapIfNeeded() {
// Do a null check to confirm that we have not already instantiated the map.
if (mMap == null) {
// Try to obtain the map from the SupportMapFragment.
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
.getMap();
// Check if we were successful in obtaining the map.
if (mMap != null) {
setUpMap();
}
}
}
private void setUpMap() {
mMap.getUiSettings().setMapToolbarEnabled(true);
mMap.getUiSettings().setZoomControlsEnabled(true);
mMap.setMyLocationEnabled(true);
mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
mClusterManager = new ClusterManager<>(this, mMap);
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(37.779977,-122.413742), 10));
mMap.setOnCameraChangeListener(mClusterManager);
mMap.setOnMarkerClickListener(mClusterManager);
mClusterManager.setRenderer(new MyClusterRenderer(this, mMap,
mClusterManager));
mMap.setInfoWindowAdapter(mClusterManager.getMarkerManager());
mMap.setOnInfoWindowClickListener(mClusterManager); //added
mClusterManager.setOnClusterItemInfoWindowClickListener(this); //added
mClusterManager
.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>() {
@Override
public boolean onClusterItemClick(MyItem item) {
clickedClusterItem = item;
return false;
}
});
addItems();
mClusterManager.getMarkerCollection().setOnInfoWindowAdapter(
new MyCustomAdapterForItems());
}
private void addItems() {
double latitude = 37.779977;
double longitude = -122.413742;
for (int i = 0; i < 10; i++) {
double offset = i / 60d;
double lat = latitude + offset;
double lng = longitude + offset;
MyItem offsetItem = new MyItem(lat, lng, "title " + i+1, "snippet " + i+1);
mClusterManager.addItem(offsetItem);
}
}
//added with edit
@Override
public void onClusterItemInfoWindowClick(MyItem myItem) {
//Cluster item InfoWindow clicked, set title as action
Intent i = new Intent(this, OtherActivity.class);
i.setAction(myItem.getTitle());
startActivity(i);
//You may want to do different things for each InfoWindow:
if (myItem.getTitle().equals("some title")){
//do something specific to this InfoWindow....
}
}
public class MyCustomAdapterForItems implements GoogleMap.InfoWindowAdapter {
private final View myContentsView;
MyCustomAdapterForItems() {
myContentsView = getLayoutInflater().inflate(
R.layout.info_window, null);
}
@Override
public View getInfoWindow(Marker marker) {
TextView tvTitle = ((TextView) myContentsView
.findViewById(R.id.txtTitle));
TextView tvSnippet = ((TextView) myContentsView
.findViewById(R.id.txtSnippet));
tvTitle.setText(clickedClusterItem.getTitle());
tvSnippet.setText(clickedClusterItem.getSnippet());
return myContentsView;
}
@Override
public View getInfoContents(Marker marker) {
return null;
}
}
public class MyClusterRenderer extends DefaultClusterRenderer<MyItem> {
private final IconGenerator mClusterIconGenerator = new IconGenerator(getApplicationContext());
public MyClusterRenderer(Context context, GoogleMap map,
ClusterManager<MyItem> clusterManager) {
super(context, map, clusterManager);
}
@Override
protected void onBeforeClusterItemRendered(MyItem item,
MarkerOptions markerOptions) {
BitmapDescriptor markerDescriptor = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA);
markerOptions.icon(markerDescriptor);
}
@Override
protected void onClusterItemRendered(MyItem clusterItem, Marker marker) {
super.onClusterItemRendered(clusterItem, marker);
}
@Override
protected void onBeforeClusterRendered(Cluster<MyItem> cluster, MarkerOptions markerOptions){
final Drawable clusterIcon = getResources().getDrawable(R.drawable.ic_lens_black_24dp);
clusterIcon.setColorFilter(getResources().getColor(android.R.color.holo_orange_light), PorterDuff.Mode.SRC_ATOP);
mClusterIconGenerator.setBackground(clusterIcon);
//modify padding for one or two digit numbers
if (cluster.getSize() < 10) {
mClusterIconGenerator.setContentPadding(40, 20, 0, 0);
}
else {
mClusterIconGenerator.setContentPadding(30, 20, 0, 0);
}
Bitmap icon = mClusterIconGenerator.makeIcon(String.valueOf(cluster.getSize()));
markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
}
}
}
Result:
Initial app launch:
Zooming out, some clustering:
Zooming out again, all Markers clustered:
这篇关于Android映射utils集群图标颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!