Android映射utils集群图标颜色 [英] Android maps utils cluster icon color

查看:144
本文介绍了Android映射utils集群图标颜色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有任何方法可以更改群集项目的背景颜色? (显示标记计数的标记,例如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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆