{"version":"0.1.0","code":"0000","result":true,"message":"处理成功","errdetail":"","timestamp":1671516356461,"data":{"id":71712975,"title":"6.3.2.5图层样式配置","slug":"snct8y","format":"lake","bookId":26046811,"body":null,"body_draft":null,"body_html":"
图层图元的显示是由图层样式配置系统来实现的,客户端调用图层服务触发业务图层显示,然后AutoSDK内部创建图层和图元,同时通过样式回调从客户端获取图层的样式和纹理id,最后显示到图面上。
采用图层样式配置的好处有:
客户端需继承和实现com.autonavi.gbl.map.layer.observer.IPrepareLayerStyle的各个接口,然后注册IPrepareLayerStyle对象到AutoSDK的图层服务或者图层中,这样在图层显示样式的时候会通过结果回调向客户端获取样式和纹理id。
分为图层图元所需要的:
样式配置"layer_item_info",配置图元显示所需要的样式信息(具体配置项根据图元类型提供的样式配置项),
以及客户端添加纹理时需要的纹理信息"marker_info"(由客户端维护,配置项包括LayerTexture中的参数,因为每个纹理的参数大多数是不一样的,也作为可配置),具体见下面的“JSON配置”。
其中"layer_item_info"根据各个图元的配置信息来配置,见各图元开发指南。
"marker_info"的配置字段(如果字段值和默认值一样建议不再配置):
"<纹理信息名>": {\n "gen_mipmaps": 0,\n "pre_mul_alpha":1,\n "repeat": 0,\n\t\t\t"anchor": 4,\n\t\t\t"x_ratio": 0.0,\n\t\t\t"y_ratio": 0.0\n\t\t},
json文件配置后,容易出现格式问题,在此网站解析验证json文件,避免格式问题花费大量时间调试。
除了路线样式信息,所有图层的图元样式,AutoSDK都通过getLayerStyle来获取和解析JSON对象格式的样式信息。客户端需要根据图元LayerItem的ItemType、BusinessType以及具体图元业务返回所需要的JSON对象。
对于一些图层图元,客户端需要把基类LayerItem转为对应的业务子类XXXLayerItem。而对于业务图层,可以通过查看API文档来取得对应的业务图元类型,比如BizLabelType
路线样式因为样式信息太多,采用独立接口进行配置,样式数据直接放在程序代码中,在getRouteLayerStyle接口中根据路线类型,返回相应的路线样式数据RouteLayerStyle给AutoSDK。
AutoSDK通过getLayerStyle获得客户端返回的图层样式JSON对象,但是对象包含的是图片名称(不包含后缀),在解析JSON对象时,需要通过getMarkerId回调获取到相应的纹理id,客户端需要根据参数strMarkerId,strMarkerInfo(图片文件名,纹理加载参数信息)以及纹理管理的接口addLayerTexture创建纹理并把id返回给AutoSDK。
纹理ID由客户端自己管理,只要保证纹理ID不重复即可,如果在添加纹理的时候使用了相同ID,则该ID对应的纹理将被覆盖。
纹理包括静态纹理和动态纹理,从磁盘中读取纹理图片或者根据业务需要动态创建纹理图片的方法都是由客户端决定,可以根据需要使用android图形库或者其它第三方图形库。另外,AutoSDK提供了卡片服务,可以用来生成静态纹理和动态纹理。
正常情况下,静态纹理会被重复使用,所以无需释放,空间换时间,提高性能,在程序退出时再释放。
正常情况下,动态纹理只会被使用一次,比如道路名,是持续发生变化,所以需要释放掉旧纹理资源,否则会造成泄漏,这时需要在删除图层图元的回调接口clearAllItems和clearLayerItem中进行释放。
com.autonavi.gbl.map.layer.model.LayerTexture
参数名 | 类型 | 注释 |
resID | int | 纹理资源ID |
dataBuff | BinaryStream | 数据缓存 |
anchorType | LayerIconAnchor | 锚点类型 |
width | long | 宽度,单位:像素 |
height | long | 高度,单位:像素 |
xRatio | float | x方向比率 ,取值范围[0,1] |
yRatio | float | y方向比率 ,取值范围[0,1] |
iconType | LayerIconType | 纹理图片类型 |
isGenMipmaps | boolean | 是否生成mipmap |
isRepeat | boolean | 是否重复平铺方式 |
errorCode | int | 错误码 |
name | String | 名称,model纹理需要 |
isPreMulAlpha | boolean | 纹理是否预乘透明通道,1:预乘;0:未预乘 |
LayerIconAnchor int com.autonavi.gbl.map.layer.model.LayerTexture.anchorType 添加纹理时,纹理默认居中,可根据图片特点选择不同的锚点类型,如果纹理显示位置比较特殊,需要使用LayerIconAnchorRandomPosition类型,则需要同时配置xRatio和yRatio,否则不需要配置,自定义锚点配置见纹理锚点配置方法。
参数 | 配置值 | 注释 |
LayerIconAnchorLeftTop | 0 | 左上角 |
LayerIconAnchorRightTop | 1 | 右上角 |
LayerIconAnchorLeftBottom | 2 | 左下角 |
LayerIconAnchorRightBottom | 3 | 右下角 |
LayerIconAnchorCenter | 4 | 居中(默认值) |
LayerIconAnchorBottom | 5 | 中下 |
LayerIconAnchorCenterTop | 6 | 中上 |
LayerIconAnchorCenterLeft | 7 | 中左 |
LayerIconAnchorCenterRight | 8 | 中右 |
LayerIconAnchorRandomPosition | 9 | 任意比例锚点 |
LayerIconAnchorLeftTopOffset | 10 | 左上角偏移固定offset 指定边距偏移锚点--用于动态纹理宽高不确定,但锚点与顶点offset是固定的场景 |
LayerIconAnchorRightTopOffset | 11 | 右上角偏移固定offset |
LayerIconAnchorLeftBottomOffset | 12 | 左下角偏移固定offset |
LayerIconAnchorRightBottomOffset | 13 | 右下角偏移固定offset |
LayerTexture.iconType是图片类型,取值由LayerTexture.dataBuff的类型决定。
参数 | 配置值 | 注释 |
LayerIconTypePVR | 0 | prv格式 |
LayerIconTypePNG | 1 | png格式 |
LayerIconTypeBMP | 2 | bmp格式 |
LayerIconTypeJPG | 3 | jpg格式 |
LayerTexture.isRepeat会影响纹理绘制效果。如果为true,绘制形成重复效果
点相关纹理一般为false,线相关纹理一般为true。
Mipmap是伴随主纹理图像的图像序列。后续图像中的每个尺寸均为前一个图像的一半。
例如:64x64 -> 32x32 -> 16x16 -> 8x8 -> 4x4 -> 2x2 -> 1x1
LayerTexture.isGenMipmaps = true的情况下,创建纹理的同时预处理生成一系列从大到小的纹理。使用时会自动选择合适的mipmap级别进行纹理绘制
点相关纹理一般为false,线相关纹理可设为true用来解决锯齿问题
LayerTexture.isPreMulAlpha的值由LayerTexture.dataBuff决定,需要确认dataBuff格式是否有预乘alpha
如果格式为(r,g,b,a),isPreMulAlpha需要为false
如果格式为(ra,ga,ba),isPreMulAlpha需要为true
当LayerTexture.isPreMulAlpha = false内部绘制的时候会乘上alpha
//设置图层业务样式回调接口\nvoid com.autonavi.gbl.layer.BizControl.setStyle(IPrepareLayerStyle pStyle)\n\n//设置图层样式回调接口\nvoid com.autonavi.gbl.map.layer.BaseLayer.setStyle(IPrepareLayerStyle pStyle)\n \n//图元样式JSON串回调接口\nString com.autonavi.gbl.map.layer.observer.IPrepareLayerStyle.getLayerStyle(BaseLayer pLayer, LayerItem pItem, boolean forJava)\n\n//路线图层样式JSON串回调接口\nboolean com.autonavi.gbl.map.layer.observer.IPrepareLayerStyle.getRouteLayerStyle(BaseLayer pLayer, LayerItem pItem, RouteLayerStyle style)\n\n//图元样式中通过marker 图片文件名获取对应的marker id回调接口\nint com.autonavi.gbl.map.layer.observer.IPrepareLayerStyle.getMarkerId(BaseLayer pLayer,LayerItem pItem, String strMarkerId, String strMarkerInfo)\n\n//清除图层所有item时,通知HMI的接口,上层根据该接口删除动态纹理或者静态纹理\nvoid com.autonavi.gbl.map.layer.observer.IPrepareLayerStyle.clearLayerItems(BaseLayer pLayer)\n\n//清除图层单个item时,通知HMI的接口,上层根据该接口删除动态纹理或者静态纹理\nvoid com.autonavi.gbl.map.layer.observer.IPrepareLayerStyle.clearLayerItem(BaseLayer pLayer, LayerItem pItem )\n\n//添加纹理\nboolean com.autonavi.gbl.map.MapView.addLayerTexture(LayerTexture texture)
说明:函数详情,请复制函数名称到在线API搜索
public class PrepareLayerStyleDemo implements IPrepareLayerStyle {\n private static final String TAG = "PrepareLayerStyleDemo";\n private volatile MapView mMapView;\n private boolean mIsNightMode = false; //当前是白天还是黑夜,返回不同的纹理样式\n private double mScaleFactor = 2; //缩放比例,在不同分辨率,纹理可能需要显示的大小不一样\n private int mDynamicMarkerId = 0;\n private List<String> mImageNameList = new ArrayList<>();\n private Map<Integer, ArrayList<DynamicItemsId> > mLayerDynamicIds = new HashMap<Integer, ArrayList<DynamicItemsId> >();\n\n class DynamicItemsId {\n DynamicItemsId(String itemId, int dynamicId) {\n this.itemId = itemId;\n this.dynamicId = dynamicId;\n }\n\n String itemId;\n int dynamicId;\n }\n\n private PrepareLayerStyleDemo() {\n }\n\n private static class SingletonInstance {\n private static final PrepareLayerStyleDemo INSTANCE = new PrepareLayerStyleDemo();\n }\n\n public static PrepareLayerStyleDemo getInstance() {\n return PrepareLayerStyleDemo.SingletonInstance.INSTANCE;\n }\n\n public void init(MapView mapView) {\n this.mMapView = mapView;\n }\n\n public void setScaleFactor(double scaleFactor) {\n this.mScaleFactor = scaleFactor;\n }\n\n public void setNightMode(boolean nightMode) {\n this.mIsNightMode = nightMode;\n }\n\n\n /**\n * @brief 获取静态markrid\n */\n public int getStaticMarkerId(int index) {\n return 0x660000 + index;\n }\n\n /**\n * @brief 获取动态markrid\n */\n public int getDynamicMarkerId() {\n if (mDynamicMarkerId >= 0x660000) {\n mDynamicMarkerId = 0x360000;\n }\n\n return mDynamicMarkerId++;\n }\n\n /**\n * @brief 对于不存在的静态纹理通过添加并生成id\n * @return bool 纹理ID\n */\n public synchronized int AddStaticMarker(BaseLayer pLayer, LayerItem pItem, String imageName, String strMarkerInfo) {\n if (mMapView == null) {\n CommonUtil.showShortToast("mapview is null");\n return -1;\n }\n\n if (strMarkerInfo.isEmpty()) {\n strMarkerInfo = imageName;\n }\n MarkerInfoBean markerInfoBean = CommonUtil.getMarkerInfoFromJson(strMarkerInfo);\n LayerTexture layerTexture = new LayerTexture();\n if (markerInfoBean != null) {\n layerTexture.anchorType = markerInfoBean.getAnchor();\n layerTexture.xRatio = markerInfoBean.getX_ratio();\n layerTexture.yRatio = markerInfoBean.getY_ratio();\n layerTexture.isRepeat = markerInfoBean.getRepeat() == 1;\n layerTexture.isGenMipmaps = markerInfoBean.getGen_mipmaps() == 1;\n layerTexture.isPreMulAlpha = markerInfoBean.getPre_mul_alpha() == 1;\n } else {\n layerTexture.anchorType = LayerIconAnchor.LayerIconAnchorCenter;\n layerTexture.isRepeat = false;\n layerTexture.xRatio = 0;\n layerTexture.yRatio = 0;\n layerTexture.isGenMipmaps = false;\n layerTexture.isPreMulAlpha = true;\n }\n\n int resID = CC.getApplication().getResources().getIdentifier(imageName, "drawable"\n , CC.getApplication().getApplicationInfo().packageName);\n Bitmap bitmap = BitmapFactory.decodeResource(CC.getApplication().getResources(), resID);\n if (bitmap == null) {\n if (pLayer == null) {\n CommonUtil.showShortToast("创建新图片纹理" + imageName + "失败");\n } else {\n CommonUtil.showShortToast(pLayer.getName() + ",创建新图片纹理" + imageName + "失败");\n }\n return -1;\n }\n\n ByteBuffer dataBuffer = ByteBuffer.allocate(bitmap.getByteCount());\n bitmap.copyPixelsToBuffer(dataBuffer);\n layerTexture.dataBuff = new BinaryStream(dataBuffer.array());\n layerTexture.width = bitmap.getWidth();\n layerTexture.height = bitmap.getHeight();\n layerTexture.iconType = LayerIconTypeBMP;\n int markerId = getStaticMarkerId(mImageNameList.size());\n layerTexture.resID = markerId;\n boolean isAddSuccess = mMapView.addLayerTexture(layerTexture);\n mImageNameList.add(imageName);\n\n return markerId;\n }\n\n public synchronized int AddDynamicMarder(String text, String strMarkerId, String strMarkerInfo) {\n if (mMapView == null) {\n CommonUtil.showShortToast("mapview is null");\n return -1;\n }\n\n int resID = CC.getApplication().getResources().getIdentifier(strMarkerId, "drawable"\n , CC.getApplication().getApplicationInfo().packageName);\n Bitmap bitmap = BitmapFactory.decodeResource(CC.getApplication().getResources(), resID);\n if (bitmap == null) {\n CommonUtil.showShortToast("创建新图片纹理" + strMarkerId + "失败");\n return -1;\n }\n\n int width = bitmap.getWidth();\n int height = bitmap.getHeight();\n Bitmap dynamicBitmap = Bitmap.createBitmap(300, 100, Bitmap.Config.ARGB_8888);\n Canvas canvas = new Canvas(dynamicBitmap);\n Paint paint = new Paint();\n paint.setTextSize(50);\n paint.setColor(Color.parseColor("#ff0000"));\n Rect src = new Rect(0, 0, width, height);\n Rect dst = new Rect(0, 0, dynamicBitmap.getWidth(), dynamicBitmap.getHeight());\n canvas.drawBitmap(bitmap, src, dst, paint);\n canvas.drawText(text, 40, dynamicBitmap.getHeight()/2, paint);\n\n ByteBuffer dataBuffer = ByteBuffer.allocate(dynamicBitmap.getByteCount());\n dynamicBitmap.copyPixelsToBuffer(dataBuffer);\n LayerTexture layerTexture = new LayerTexture();\n layerTexture.dataBuff = new BinaryStream(dataBuffer.array());\n layerTexture.width = dynamicBitmap.getWidth();\n layerTexture.height = dynamicBitmap.getHeight();\n layerTexture.iconType = LayerIconTypeBMP;\n int dynamicId = getDynamicMarkerId();\n layerTexture.resID = dynamicId;\n boolean isAddSuccess = mMapView.addLayerTexture(layerTexture);\n\n return dynamicId;\n }\n\n public synchronized int isDynamicMarker(BaseLayer pLayer, LayerItem layerItem, String strMarkerId, String strMarkerInfo) {\n int dynamicId = -1;\n if (pLayer == null || layerItem == null || strMarkerId == null || strMarkerId.isEmpty()) {\n return dynamicId;\n }\n\n int itemType = layerItem.getItemType();\n int businessType = layerItem.getBusinessType();\n\n switch (businessType) {\n case BizRouteType.BizRouteTypeGuidePathBoard: {\n PathBoardLayerItem pathBoardItem = (PathBoardLayerItem) (layerItem);\n\n if (pathBoardItem != null) {\n String roadName = pathBoardItem.getMBoardName();\n if (roadName.isEmpty()) {\n roadName = "无名道路";\n }\n\n dynamicId = AddDynamicMarder(roadName, strMarkerId, strMarkerInfo);\n }\n break;\n }\n }\n\n if (dynamicId != -1) {\n Integer layerId = Integer.valueOf((int)pLayer.getLayerID());\n ArrayList<DynamicItemsId> dynamicIds = new ArrayList<DynamicItemsId>();\n if (mLayerDynamicIds.containsKey(layerId))\n {\n dynamicIds = mLayerDynamicIds.get(layerId);\n }\n\n DynamicItemsId itemsId = new DynamicItemsId(layerItem.getID(), dynamicId);\n dynamicIds.add(itemsId);\n\n mLayerDynamicIds.put(layerId, dynamicIds);\n }\n\n return dynamicId;\n }\n\n /**\n * @brief 图元样式中通过marker 图片文件名获取对应的marker id回调接口\n * @param[in] pLayer 图元所在图层\n * @param[in] pItem 需要更新样式的具体图元,通过GetBusinessType返回值判断具体图层\n * @param[in] strMarkerInfo marker对应纹理的数据参数配置名\n * @return int32_t 返回图片的marker id\n * @note thread:main HMI根据图片文件名添加纹理并且返回相应的marker id,如果是marker id,则转换成int32_t后返回\n */\n @Override\n public synchronized int getMarkerId(BaseLayer pLayer, LayerItem pItem, String strMarkerId, String strMarkerInfo) {\n int markerId = -1;\n strMarkerId = strMarkerId.trim();\n if (TextUtils.isEmpty(strMarkerId)) {\n return markerId;\n }\n\n if (CommonUtil.isInteger(strMarkerId)) {\n // 如果样式json中配置的纹理id是数字,说明已经由HMI提早在某个地方把纹理添加到mapview,这里直接把id值返回即可。\n markerId = NumberUtil.str2Int(strMarkerId, 10, AutoConstant.DEFAULT_ERR_CODE);\n } else {\n // 否则根据样式json配种的信息和图层图元判断是否是需要根据图元信息动态生成的纹理(简称动态纹理),如果是则绘制纹理并添加到mapview并返回对应的纹理id\n int dynamicMarderId = isDynamicMarker(pLayer, pItem, strMarkerId, strMarkerInfo);\n if (dynamicMarderId > 0) {\n return dynamicMarderId;\n }\n\n // 如果纹理不是动态纹理,则直接根据样式json中配置的纹理对应的图片名添加纹理或直接返回纹理id(如果已经添加过)\n // 这里静态纹理id取在列表中的序列。\n int index = mImageNameList.indexOf(strMarkerId);\n if (index >= 0) {\n markerId = getStaticMarkerId(index);\n return markerId;\n }\n\n markerId = AddStaticMarker(pLayer, pItem, strMarkerId, strMarkerInfo);\n }\n\n return markerId;\n }\n\n\n /**\n * @brief 图元样式中通过3Dmodel 模型文件名获取对应的3Dmodel id回调接口\n * @param[in] pLayer 图元所在图层\n * @param[in] pItem 需要更新样式的具体图元,通过GetBusinessType返回值判断具体图层\n * @return int32_t 返回模型3Dmodel id\n * @note thread:main HMI根据模型文件名添加纹理并且返回相应的3Dmodel id,如果是3Dmodel id,则转换成int32_t后返回\n */\n @Override\n public int get3DModelId(BaseLayer pLayer, LayerItem pItem, String str3DModelId) {\n int retValue = -1;\n if (CommonUtil.isInteger(str3DModelId.trim())) {\n retValue = NumberUtil.str2Int(str3DModelId.trim(), 10, AutoConstant.DEFAULT_ERR_CODE);\n } else {\n CommonUtil.showShortToast("未识别的3D纹理" + str3DModelId);\n }\n\n return retValue;\n }\n\n /**\n * @brief 图元样式JSON串回调接口\n * @param[in] pLayer 图元所在图层\n * @param[in] layerItem 需要更新样式的具体图元,通过GetBusinessType返回值判断具体图层\n * @param[in] forJava 参数暂时无用,只是标示当前接口用于支持Java端,传递Stirng而非cJSON*\n * @return String 返回的样式JSON内容字符串,由客户端构造\n * @note thread:main\n */\n @Override\n public String getLayerStyle(final BaseLayer pLayer, LayerItem layerItem, boolean forJava) {\n String strStyleJson = "EMPTY";\n if (pLayer == null || layerItem == null) {\n return strStyleJson;\n }\n\n int itemType = layerItem.getItemType();\n int businessType = layerItem.getBusinessType();\n\n switch (itemType) {\n case LayerItemType.LayerItemPointType:\n switch (businessType) {\n case DemoConstant.BusinessTypePoint:\n strStyleJson = CommonUtil.getDemoStyleBeanJsonWithNightMode("point_demo_style", mIsNightMode);\n break;\n\n case DemoConstant.BusinessTypeCollisionPoint:\n PointLayerItemDemo collisionItem = (PointLayerItemDemo)layerItem;\n if (collisionItem.mDirection == ItemDirection.ItemDirectionLeft) {\n strStyleJson = CommonUtil.getDemoStyleBeanJsonWithNightMode("collision_left_demo_style", mIsNightMode);\n } else {\n strStyleJson = CommonUtil.getDemoStyleBeanJsonWithNightMode("collision_right_demo_style", mIsNightMode);\n }\n break;\n }\n break;\n case LayerItemLineType:\n switch (businessType) {\n case DemoConstant.BusinessTypeLine:\n strStyleJson = CommonUtil.getDemoStyleBeanJsonWithNightMode("line_demo_style", mIsNightMode);\n break;\n }\n break;\n case LayerItemPolygonType:\n switch (businessType) {\n case DemoConstant.BusinessTypePolygon:\n strStyleJson = CommonUtil.getDemoStyleBeanJsonWithNightMode("polygon_demo_style", mIsNightMode);\n break;\n }\n break;\n case LayerItemSectorType:\n switch (businessType) {\n case DemoConstant.BusinessTypeCircle:\n strStyleJson = CommonUtil.getDemoStyleBeanJsonWithNightMode("circle_demo_style", mIsNightMode);\n break;\n }\n break;\n case LayerItem3DModelType:\n switch (businessType) {\n case BizCarType.BizCarTypeCruise:\n case BizCarType.BizCarTypeGuide:\n case BizCarType.BizCarTypeSearch:\n case BizCarType.BizCarTypeFamiliar:\n strStyleJson = CommonUtil.getStyleBeanJson("3dcar_style");\n break;\n }\n break;\n case LayerItemArrowType:\n switch (businessType) {\n case DemoConstant.BusinessTypeArrow:\n strStyleJson = CommonUtil.getDemoStyleBeanJsonWithNightMode("arrow_demo_style", mIsNightMode);\n break;\n }\n break;\n default:\n break;\n }\n\n return strStyleJson;\n }\n\n /**\n * @brief 路线图元样式回调接口\n * @param[in] pLayer 图元所在图层\n * @param[in] pItem 需要更新样式的具体图元,通过GetBusinessType返回值判断具体图层\n * @param[in] style 返回的样式数据结果\n * @return bool true:成功 false:失败\n * @note thread:main\n */\n @Override\n public boolean getRouteLayerStyle(BaseLayer baseLayer, LayerItem layerItem, RouteLayerStyle routeLayerStyle) {\n return false;\n }\n\n /**\n * <\n *\n * @brief 清除图层所有item时,通知HMI的接口,上层根据该接口删除动态纹理或者静态纹理\n * @param[in] pLayer 图层对象\n * @note thread:main HMI或BL内部调用ClearAllItems时触发该回调\n */\n @Override\n public synchronized void clearLayerItems(BaseLayer baseLayer) {\n if (baseLayer == null || mMapView == null) {\n return;\n }\n\n Integer layerId = Integer.valueOf((int)baseLayer.getLayerID());\n if (mLayerDynamicIds.containsKey(layerId)) {\n ArrayList<DynamicItemsId> dynamicIds = mLayerDynamicIds.get(layerId);\n\n for (int i = 0; i < dynamicIds.size(); i++) {\n DynamicItemsId itemsId = dynamicIds.get(i);\n mMapView.destroyTexture(itemsId.dynamicId);\n }\n\n mLayerDynamicIds.remove(layerId);\n }\n }\n\n /**\n * <\n *\n * @brief 清除图层所有item时,通知HMI的接口,上层根据该接口删除动态纹理或者静态纹理\n * @param[in] pLayer 图层对象\n * @note thread:main HMI或BL内部调用ClearAllItems时触发该回调\n */\n @Override\n public synchronized void clearLayerItem(BaseLayer baseLayer, LayerItem layerItem) {\n if (baseLayer == null || layerItem == null || mMapView == null) {\n return;\n }\n\n Integer layerId = Integer.valueOf((int)baseLayer.getLayerID());\n String itemId = layerItem.getID();\n\n if (mLayerDynamicIds.containsKey(layerId)) {\n boolean removed = false;\n ArrayList<DynamicItemsId> dynamicIds = mLayerDynamicIds.get(layerId);\n\n for (int i = 0; i < dynamicIds.size(); i++) {\n DynamicItemsId itemsId = dynamicIds.get(i);\n if (itemsId.itemId.equals(itemId)) {\n removed = true;\n mMapView.destroyTexture(itemsId.dynamicId);\n }\n }\n\n if (removed) {\n dynamicIds.remove(itemId);\n mLayerDynamicIds.put(layerId, dynamicIds);\n }\n }\n }\n\n public synchronized void uninit() {\n mMapView = null;\n mImageNameList.clear();\n mLayerDynamicIds.clear();\n }\n}
{\n "marker_info": {\n\t\t"road_facilities_x_y": {\n\t\t\t"anchor":9,\n\t\t\t"x_ratio":0.5,\n\t\t\t"y_ratio":0.935\n }\t\n },\n "layer_item_info": {\n\t\t"point_demo_style": {\n\t\t\t"point_layer_item_style": {\n\t\t\t\t"normal_style": {\n\t\t\t\t\t"poi_marker_id": "familiar_company_night",\n "poi_marker_info": "road_facilities_x_y"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n }\n}
1,纹理的添加和释放由客户端自行管理,包括纹理ID也是一样,只要保证ID的唯一性。如果ID一样,旧的ID对应的纹理会被覆盖(被覆盖后,旧的纹理会由AutoSDK内部释放)。
2,动态纹理由客户端根据自己选定的图形库绘制后添加到纹理中。
3,AutoSDK可容纳的纹理数量总共500张,但是内部会使用100张左右,所以客户端可以使用400左右,需要注意不能超过这个数。
","body_lake":null,"pub_level":null,"status":"0","updated_at":"2022-04-06 07:03:45","deleted_at":null,"nameSpace":"mnlcaa/v610","browseCount":160,"collectCount":0,"estimateDate":44,"docStatus":0,"permissions":true,"overView":false}}