{"version":"0.1.0","code":"0000","result":true,"message":"处理成功","errdetail":"","timestamp":1671516355742,"data":{"id":71712557,"title":"6.3.2.4图层点击、焦点变化","slug":"gdguup","format":"lake","bookId":26046811,"body":null,"body_draft":null,"body_html":"

基本介绍

对于图层图元的点击事件、焦点变化事件,图层提供了点击、焦点变化观察者,由客户端继承实现观察者类并注册到基础图层或者图层控制器。在点击、焦点变化事件发生时,回调通知到客户端。其中车标和飞线比较特殊,有自己的观察者类。

时序图

关键参数

com.autonavi.gbl.map.layer.observer.ILayerClickObserver.onNotifyClick

成员

含义

layer

通知点击事件发生在哪个图层

pItem

通知点击的是哪个图元

com.autonavi.gbl.map.layer.model.CarLoc

成员

含义

speed

车速,单位:km/s

un32Time

时间戳,单位:毫秒

vecPathMatchInfo

多备选路线引导信息

核心接口

//添加业务图层控制点击观察者回调\nvoid com.autonavi.gbl.layer.BizControl.addClickObserver(ILayerClickObserver pObserver)\n//添加业务图层控制焦点变化观察者回调\nvoid com.autonavi.gbl.layer.BizControl.addFocusChangeObserver(ILayerFocusChangeObserver pObserver)\n\n//添加基础图层点击观察者回调\nvoid com.autonavi.gbl.map.layer.BaseLayer.addClickObserver(ILayerClickObserver pObserver)\n//添加基础图层焦点变化观察者回调\nvoid com.autonavi.gbl.map.layer.BaseLayer.addFocusChangeObserver(ILayerFocusChangeObserver pObserver)\n\n//添加飞线点击观察者回调\nvoid com.autonavi.gbl.layer.BizFlyLineControl.addClickObserver(ILayerClickObserver pObserver)\n\n//图层点击回调接口\nvoid com.autonavi.gbl.map.layer.observer.ILayerClickObserver.onNotifyClick(BaseLayer layer, LayerItem pItem, ClickViewIdInfo clickViewIds)\n\n//图层焦点变化回调接口\nvoid com.autonavi.gbl.map.layer.observer.ILayerFocusChangeObserver.onNotifyFocusChange(BaseLayer layer, LayerItem pItem, boolean isFocus)\n\n//添加车标观察者回调\nboolean com.autonavi.gbl.layer.BizCarControl.addCarObserver(ICarObserver pObserver)\n\n//车标点击回调接口\nvoid com.autonavi.gbl.map.layer.observer.ICarObserver.onCarClick(CarLoc carLoc)\n\n//车标变更回调接口\nvoid com.autonavi.gbl.map.layer.observer.ICarObserver.onCarLocChange(CarLoc carLoc)

说明:函数详情,请复制函数名称到在线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    }\n\n    public void unInit() {\n        MapView mapView = getMapView();\n        if (mapView != null) {\n            setStyle(null);\n            removeClickObserver(LayerClickObserverDemo.getInstance());\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    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
public class LayerClickObserverDemo implements ILayerClickObserver {\n    private LayerClickObserverDemo() {\n    }\n\n    private static class SingletonInstance {\n        private static final LayerClickObserverDemo INSTANCE = new LayerClickObserverDemo();\n    }\n\n    public static LayerClickObserverDemo getInstance() {\n        return LayerClickObserverDemo.SingletonInstance.INSTANCE;\n    }\n\n    @Override\n    public void onNotifyClick(BaseLayer baseLayer, LayerItem layerItem) {\n        //需要特别注意:baseLayer和layerItem只能在这个函数中使用,不能抛到其它线程中使用(因为对象可能已经被释放)\n        if (baseLayer == null || layerItem == null) {\n            return;\n        }\n\n        int businessType = layerItem.getBusinessType();\n        int itemType = layerItem.getItemType();\n        String id = layerItem.getID();\n\n        switch (businessType) {\n            default: {\n                CommonUtil.showShortToast("onNotifyClick: " + businessType + ", id: " + layerItem.getID());\n                break;\n            }\n        }\n    }\n}\n

注意事项

1、OnNotifyClick等AutoSDK回调中,不建议再使用客户端的锁,因为AutoSDK回调的上下文中基本都是有使用锁来保护,如果客户端再使用锁,很有可能跟AutoSDK的锁形成交叉死锁。

建议:客户端在AutoSDK回调中切换到UI线程或其它线程中,再进行相关图层业务处理,这样客户端使用自己的锁就不会和AutoSDK的锁形成死锁。如果必须在AutoSDK的回调中使用客户端锁,那就必须确保在客户端锁的范围中没有调用AutoSDK接口。


2、OnNotifyClick等回调中,因为要求保证图层业务在同一个线程中执行,所以需要抛线程到Biz线程或UI线程中再执行,但是需要注意:不能把OnNotifyClick的参数layer和item对象抛到那个线程中去访问,因为layer和item可能已经被释放,后面可能就是访问一个已经被释放的对象,引发崩溃等问题。需要先把layer和item需要用到的数据取出来,然后在那个线程中使用。


3、使用卡片能力时,已经处于选中态的Item,再次点击不会通知点击事件。

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