{"version":"0.1.0","code":"0000","result":true,"message":"处理成功","errdetail":"","timestamp":1671516354265,"data":{"id":71712540,"title":"6.3.2.2图层碰撞","slug":"pg7ed2","format":"lake","bookId":26046811,"body":null,"body_draft":null,"body_html":"

基本介绍

图层碰撞分为图层内部图元的碰撞和图层之间的碰撞。根据图元的优先级或图层的优先级进行碰撞,高优先级碰撞掉低优先级。如果图元或图层处在焦点态,则优先级最高,不会被其它图元碰撞掉。

只要开启了图层内碰撞能力,就会根据图元的优先级进行碰撞,高优先级图元碰掉低优先级图元。通过接口BaseLayer.enableCollision开启或关闭图层内碰撞。

图层与图层之间的碰撞,碰撞规则是可配置的,客户端需要调用BizControlService.initCollisionConfig,传入包含配置信息的配置文件。具体见"业务图层间碰撞"

场景图

\"image.png\"\"image.png\"

终点区域图层,父节点(清华大学)与子节点间的业务图层间碰撞,以及子节点(出入口,停车场)图层内碰撞

核心接口

//开启或关闭图层内碰撞,默认未开启\nvoid com.autonavi.gbl.map.layer.BaseLayer.enableCollision(boolean enable)

说明:函数详情,请复制函数名称到在线API搜索

调用示例

public class PointLayerDemo extends BaseLayer {\n    public PointLayerDemo(String name, MapView mapView) {\n        super(name, mapView);\n        if (mapView != null) {\n            mapView.getLayerMgr().addLayer(this); //把图层添加到图层管理器中\n        }\n    }\n\n    public void init() {\n        MapView mapView = getMapView();\n        if (mapView != null) {\n            PrepareLayerStyleDemo.getInstance().init(mapView);\n            setStyle(PrepareLayerStyleDemo.getInstance()); //设置图元样式回调\n            addClickObserver(LayerClickObserverDemo.getInstance());\n            setClickable(true);\n\n            enableCollision(true); //启用图层的图元间的碰撞功能\n        }\n    }\n\n    public void unInit() {\n        MapView mapView = getMapView();\n        if (mapView != null) {\n            setStyle(null);\n            removeClickObserver(LayerClickObserverDemo.getInstance());\n            enableCollision(false);\n        }\n    }\n\n    /**< 图层最后不再使用时,从图层管理器中删除,同时图层会被delete释放掉 */\n    public void removeLayer() {\n        MapView mapView = getMapView();\n        if (mapView != null) {\n            mapView.getLayerMgr().removeLayer(this);\n        }\n    }\n\n    /**< 添加用于碰撞的点图元 */\n    public void updatePointInfo(ArrayList<BizPointBusinessInfo> pointList) {\n        if (getMapView() == null || pointList.size() == 0) {\n            return;\n        }\n\n        clearAllItems();\n        ArrayList<LayerItem> items = new ArrayList<>();\n        for (int i = 0; i < pointList.size(); i++) {\n            PointLayerItem item = new PointLayerItem();\n            if (item != null) {\n                String id = pointList.get(i).id;\n                if (id.isEmpty()) {\n                    id = String.valueOf(i);\n                }\n\n                item.setID(id); //id必须唯一\n                item.setBusinessType(DemoConstant.BusinessTypePoint);\n                item.setPriority(i);\n                item.setPosition(pointList.get(i).mPos3D);\n\n                items.add(item);\n            }\n        }\n\n        addItems(items);\n    }\n}\n

注意事项

1、碰撞并非是把图元删除掉,碰撞只是把图元隐藏掉,如果两个图元或图层不再碰撞,则会再次显示出来;

2、碰撞计算是发生在渲染每一帧当中,所以碰撞比较消耗性能,不建议包含20个以上图元的碰撞,否则会影响图面的流畅度;

","body_lake":null,"pub_level":null,"status":"0","updated_at":"2022-04-06 07:03:42","deleted_at":null,"nameSpace":"mnlcaa/v610","browseCount":160,"collectCount":0,"estimateDate":6,"docStatus":0,"permissions":true,"overView":false}}