Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >缩放时DefaultClusterRenderer getMarker()返回null

缩放时DefaultClusterRenderer getMarker()返回null
EN

Stack Overflow用户
提问于 2016-02-26 23:12:05
回答 1查看 2.7K关注 0票数 10

我想在点击时改变集群标记的背景。我是通过

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
onClusterClick(Cluster<MyObject> cluster) {
    Marker marker = renderer.getMarker(cluster);
    marker.setIcon(....);
}

这可以很好地工作,但有一种情况除外:当我放大或缩小时,簇标记的数量没有变化。例如,如果我有一个15的集群和一个5的集群,然后放大或缩小一个级别,相同的两个集群仍然存在。单击其中之一,现在renderer.getMarker(cluster)将返回null。如果它们在缩放后重新聚集,则getMarker不为空。

我的DefaultClusterRenderer在下面。我检查了onClusteredRendered上的标记,它从不为空。这是DefaultClusterRenderer中的一个错误,还是我应该做其他事情?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private class MyRenderer extends DefaultClusterRenderer<MyObject> {

    private IconGenerator iconGenerator;
    private float density;

    public MyRenderer(Context context, GoogleMap map, ClusterManager<MyObject> clusterManager) {
        super(context, map, clusterManager);
        density = context.getResources().getDisplayMetrics().density;
    }

    @Override
    protected void onBeforeClusterItemRendered(MyObject item, MarkerOptions markerOptions) {
        markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.my_pin));
    }

    @Override
    protected void onBeforeClusterRendered(Cluster<MyObject> cluster, MarkerOptions markerOptions) {
        if(iconGenerator == null) {
            iconGenerator = new IconGenerator(getActivity());
            iconGenerator.setContentView(makeTextView(getActivity()));
        }
        iconGenerator.setBackground(makeBackground(false));

        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(iconGenerator.makeIcon(String.valueOf(cluster.getSize()))));
    }

    @Override
    protected void onClusterRendered(Cluster<MyObject> cluster, Marker marker) {
        super.onClusterRendered(cluster, marker);
        // Marker is never null here

    }

    @Override
    protected boolean shouldRenderAsCluster(Cluster<MyObject> cluster) {
        return cluster.getSize() > 1;
    }

    private ShapeDrawable makeBackground(boolean isClicked) {
        ShapeDrawable background = new ShapeDrawable(new OvalShape());
        background.setColorFilter(ContextCompat.getColor(getActivity(),
                isClicked ? R.color.cluster_marker_clicked : R.color.cluster_marker_unclicked), PorterDuff.Mode.SRC_ATOP);

        return background;
    }

    private SquareTextView makeTextView(Context context) {
        SquareTextView squareTextView = new SquareTextView(context);

        ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(-2, -2);
        squareTextView.setLayoutParams(layoutParams);
        squareTextView.setTextColor(ContextCompat.getColor(getActivity(), R.color.white));

        squareTextView.setTypeface(Utils.getFontBold(getActivity()));

        squareTextView.setId(com.google.maps.android.R.id.text);
        int twelveDpi = (int) (12.0F * density);
        squareTextView.setPadding(twelveDpi, twelveDpi, twelveDpi, twelveDpi);

        return squareTextView;
    }

    public IconGenerator getIconGenerator(boolean isClicked) {
        iconGenerator.setBackground(makeBackground(isClicked));
        return iconGenerator;
    }
}

初始化ClusterManager:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    final ClusterManager<MyObject> mClusterManager = new ClusterManager<>(getActivity(), googleMap);
    mClusterManager.addItems(items);

    renderer = new CustomRenderer(getActivity(), googleMap, mClusterManager);
    mClusterManager.setRenderer(renderer);
    mClusterManager.cluster();

    mClusterManager.setOnClusterItemClickListener(this);

    googleMap.setOnMarkerClickListener(mClusterManager);

@antonio:这个初始化对我是有效的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MapsActivity extends FragmentActivity
        implements ClusterManager.OnClusterClickListener<MyObject> {

    // ...

    private void setUpClusterer() {
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(51.503186, -0.126446), 10));

        mClusterManager = new ClusterManager<MyObject>(this, googleMap);
        mClusterManager.setOnClusterClickListener(this);
        renderer = new MyRenderer(this, googleMap, mClusterManager);
        mClusterManager.setRenderer(renderer);

        googleMap.setOnCameraChangeListener(mClusterManager);
        googleMap.setOnMarkerClickListener(mClusterManager);

        addItems();
    }

    private void addItems() {
        // Set some lat/lng coordinates to start with.
        double lat = 51.5145160;
        double lng = -0.1270060;

        // Add ten cluster items in close proximity, for purposes of this example.
        for (int i = 0; i < 10; i++) {
            double offset = i / 60d;
            lat = lat + offset;
            lng = lng + offset;
            MyObject offsetItem = new MyObject(lat, lng);
            mClusterManager.addItem(offsetItem);
        }
    }

    @Override
    public boolean onClusterClick(final Cluster<MyObject> cluster) {
        Marker marker = renderer.getMarker(cluster);
        marker.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.my_newpin));

        return true;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2016-02-29 19:34:07

在上述情况下,无法让renderer.getMarker(cluster)返回标记。一种变通办法是创建:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Map <Cluster<MyObject>, Marker> clusterMarkerMap = new HashMap<>();

然后在DefaultClusterRenderer回调中添加它们,因为那里的标记永远不会为空:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
protected void onClusterRendered(Cluster<MyObject> cluster, Marker marker) {
    super.onClusterRendered(cluster, marker);
    clusterMarkerMap.put(cluster, marker);
}

由于DefaultClusterManager会在摄影机位置更改时清除它们,因此请在创建新的簇标记贴图之前擦除该簇标记贴图:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
        @Override
        public void onCameraChange(CameraPosition cameraPosition) {
            // Clear the map here because the markers will be recreated
            // when the manager is notified of a (zoom level) camera change
            if(zoomLevelChanged)
                 clusterMarkerMap.clear();
            mClusterManager.onCameraChange(cameraPosition);
        }
    });

现在我可以成功获取标记了,clusterMarkerMap.get(cluster)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35663420

复制
相关文章
[译] 为什么String在Java中是不可变的
String 在 Java 中是不可变的。 不可变类只是一个无法修改其实例的类。 创建实例时,将初始化实例中的所有信息,并且无法修改信息。 不可变类有许多优点。 本文总结了为什么 String 设计为不可变的。 这篇文章从内存,同步和数据结构的角度说明了不变性概念。
haifeiWu
2020/02/10
1.3K0
jsp中在href中传递参数
<% Configuration conf = new Configuration(); URI uri = new URI("hdfs://192.168.0.52:9010"); FileSystem fileSystem = FileSystem.get(uri, conf); //System.out.println("Hdfs directory is"+"\n"); Path src1 = new Path("hdfs://192.168.0.52:9
闵开慧
2018/03/30
4.7K0
什么是线程组,为什么在 Java 中不推荐使用?
线程组是使用 Java 线程进行管理和组织的一种模型。Java 中的线程组是一个 ThreadGroup 类对象,它充当了一个父容器,可以将同一类线程分成一组,并提供追踪这些线程状态、统计信息及管理这些线程的方法。在线程组中,如果发生未捕获异常,可以通过 Thread.UncaughtExceptionHandler 进行处理。
用户1289394
2023/08/22
3380
什么是线程组,为什么在 Java 中不推荐使用?
在 Vue 中,使用 $attrs 构建高级组件
这节课,我们来看下 Vue3 中的 $attrs 属性。首先,我们会介绍它的用途以及它的实现与 Vue2 有哪些不两同点,并通过事例来加深对它的理解。
前端小智@大迁世界
2022/10/27
2.5K0
在 Vue 中,使用 $attrs 构建高级组件
我是这样在 React 中实践 TDD 编程的
在Redux中编写测试听起来肯定有悖直觉。如果你使用了Redux,它可能看起来更加复杂。
前端修罗场
2022/07/29
2K0
在gradle中构建java项目
之前的文章我们讲到了gradle的基本使用,使用gradle的最终目的就是为了构建java项目。今天本文将会详细的讲解如何在gradle中构建java项目。
程序那些事
2021/02/20
1.8K0
在gradle中构建java项目
之前的文章我们讲到了gradle的基本使用,使用gradle的最终目的就是为了构建java项目。今天本文将会详细的讲解如何在gradle中构建java项目。
程序那些事
2021/02/25
1.3K0
在gradle中构建java项目
之前的文章我们讲到了gradle的基本使用,使用gradle的最终目的就是为了构建java项目。今天本文将会详细的讲解如何在gradle中构建java项目。
子润先生
2021/06/21
1.7K0
在 Gitlab 中构建 Docker 镜像
有了 Gitlab CI 的脚本能力,又有容器镜像仓库的支持,自然的一个想法就是,在 Gitlab 上构建容器镜像,并推送到镜像仓库之中。
崔秀龙
2019/07/22
2.3K0
在 Gitlab 中构建 Docker 镜像
为什么在静态方法中不能使用this
在JVM的运行时数据区中有个虚拟机栈(或Java栈),在它的里面是由栈帧'叠加'而成.栈帧由局部变量表,操作数栈,动态连接,方法返回地址等组成.
书唐瑞
2022/06/02
1.9K0
为什么在静态方法中不能使用this
我在ThoughtWorks中的敏捷实践
E项目是一个在线的物资跟踪监控系统。由ThoughtWorks团队为客户提供的一套完善的软件交付服务。
袁慎建@ThoughtWorks
2018/09/29
2.1K0
我在ThoughtWorks中的敏捷实践
python2中为什么在进行类定义时最好
Person类很明显能够看出区别,不继承object对象,只拥有了doc , module 和 自己定义的name变量, 也就是说这个类的命名空间只有三个对象可以操作. Animal类继承了object对象,拥有了好多可操作对象,这些都是类中的高级特性。
py3study
2020/01/09
1.2K0
我应该使用 PyCharm 在 Python 中编程吗?
Python 是一种广泛使用的编程语言,以其简单、多功能和庞大的开发人员社区而闻名。这个社区不断创建新的库和工具,以提高Python编程的效率和便利性。选择正确的环境来编写和调试 Python 代码可能具有挑战性,但 PyCharm 是一个很好的选择,从其他选项中脱颖而出。
很酷的站长
2023/02/20
4.7K0
我应该使用 PyCharm 在 Python 中编程吗?
在LR中动态拼接参数的问题
在很多时候系统是提供了多选并且组合提交的操作,这个时候请求就需要动态拼接了,这里举个参考的例子给大家,希望能够让大家明白怎么回事。
TestOps
2022/04/04
2K0
在LR中动态拼接参数的问题
在java中构建高效的结果缓存
缓存是现代应用服务器中非常常用的组件。除了第三方缓存以外,我们通常也需要在java中构建内部使用的缓存。那么怎么才能构建一个高效的缓存呢? 本文将会一步步的进行揭秘。
程序那些事
2020/07/08
1.5K0
在React中如何使用history.push传递参数
第一种和第三种,在目标路由刷新后,参数还可以取到,但是第二种页面刷新后,参数就取不到了,第二种适合开发winform类的应用。
挥刀北上
2021/12/19
21.5K0
在React中如何使用history.push传递参数
React 必学SSR框架——next.js
F首先我们就回顾一下,我们到底是怎么告别了使用 php/jsp 做服务器端渲染,进入前后端分离的客户端渲染时代,又为什么重新回到了服务端渲染。
狂奔滴小马
2021/11/15
7.7K0
React 必学SSR框架——next.js
如何使用ParamSpider在Web文档中搜索敏感参数
ParamSpider是一款功能强大的Web参数挖掘工具,广大研究人员可以利用ParamSpider来从Web文档的最深处挖掘出目标参数。
FB客服
2020/09/14
3.7K0
如何使用ParamSpider在Web文档中搜索敏感参数
我在使用 Go 过程中犯过的低级错误
循环迭代器变量是一个在每次循环迭代中采用不同值的单个变量。如果我们一直使用一个变量,可能会导致不可预知的行为。
用户5166556
2023/03/18
2.1K0
我在使用 Go 过程中犯过的低级错误
在Pytorch中构建流数据集
在处理监督机器学习任务时,最重要的东西是数据——而且是大量的数据。当面对少量数据时,特别是需要深度神经网络的任务时,该怎么办?如何创建一个快速高效的数据管道来生成更多的数据,从而在不花费数百美元在昂贵
deephub
2020/12/11
1.2K0
在Pytorch中构建流数据集

相似问题

getInitialProps在Next.js中是什么

19

getInitialProps在Next.js中的条件执行

12

getInitialProps在Next.js与TypeScript中的应用

61

在Next.js中重定向getInitialProps时出现无限循环

157

next.js - getInitialProps在组件中不起作用

239
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文