{"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,再次点击不会通知点击事件。