前言
图例由于官方文档写的很模糊,我是请假了师父的情况下,在他的指导下,看官方的iOS图例方法做的。
正文
public void getmLegendBeans(OnLegendShowListener onLegendShowListener) {
mLegendBeans.clear();//清除一次列表,保证不会让数据叠加
List<LayerWorkBean> layers = getSelectedLayerList();//获取到加载的图层
if (layers == null || layers.isEmpty()) {
ToastUtil.makeText("当前未加载图层");
return;
}
LayerWorkBean layerBean = layers.get(layers.size() - 1);//只取最上面那层的图例
List<Layer> lLayer = layerBean.getLayers();
if (lLayer == null || lLayer.isEmpty()) {
ToastUtil.makeText("获取图例失败");
return;
}
Layer layer = lLayer.get(lLayer.size() - 1);
getLegends(layer, onLegendShowListener);
}
private void getLegends(LayerContent layer, OnLegendShowListener onLegendShowListener) {
ListenableList<LayerContent> subLayers = layer.getSubLayerContents();
if (subLayers != null && !subLayers.isEmpty()) {//如果不为空,说明有内层,所以要取内层,递归
XLog.e("subLayers=" + subLayers);
LayerContent lc = subLayers.get(0);
lc.setCanShowInLegend(true);
getLegends(lc, onLegendShowListener);
} else {
//没有内层了,就可以取图例的名称和图标
ListenableFuture<List<LegendInfo>> results = layer.fetchLegendInfosAsync();
results.addDoneListener(() -> new Thread(() -> {
try {
List<LegendInfo> tResult = results.get();
for (int i = 0; i < tResult.size(); i++) {
String tName = tResult.get(i).getName();
Symbol tSymbol = tResult.get(i).getSymbol();
XLog.e("tResult.getname=" + tName);
ListenableFuture<Bitmap> tListFuture
= tSymbol.createSwatchAsync(
BaseApplication.bsnContext.get(),
ContextCompat.getColor(BaseApplication.bsnContext.get(), R.color.sj_bg_90_ffffff)
);
Bitmap bitmap = null;
try {
bitmap = tListFuture.get();//把Symbol转换成bitmap
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
}
legendBean = new LegendBean(tName, bitmap);//创建对象
mLegendBeans.add(legendBean);//把对象加到数组去
}
if (onLegendShowListener != null) {
onLegendShowListener.legendShow(mLegendBeans);//由于上面的过程是在线程中做的,是一个异步的过程,所以这边写了个接口,用于完成之后回调,把数组传出去
}
} catch (Exception e) {
e.printStackTrace();
if (onLegendShowListener != null) {
onLegendShowListener.legenfError();
}
}
}).start());
}
}
//这边是点击事件
mCatalogManager.getmLegendBeans(new OnLegendShowListener() {
@Override
public void legendShow(List<LegendBean> legends) {
XLog.e("mlegendBeans=" + legends);
if (legends.isEmpty()) {
return;
}
runOnUiThread(() -> {
mLegendListAdapter.replaceData(legends);//把获取到的数据放到adapter里
});
}
@Override
public void legenfError() {
runOnUiThread(() -> ToastUtil.makeText("图例获取失败"));
}
});
图例我感觉靠我个人完成是很有难度的,所以很大部分都是请教了师父,师父也帮我看文档,帮我找问题,很幸运实习能碰到这么平易近人的师父,哈哈,以后继续努力。