在使用百度地图添加自定义Marker View时,显示不出来自定义marker view里面的头像,百度地图的添加自定义marker显示网络图片本身就是一个坑(我是这样认为的)...
我的需求是这样的,当有人员上报位置时,就根据经纬度把人员位置信息用自定义Marker去加载请求头像的方式显示出来,添加一个或多个的网络头像时图片显示不出来,如果使用InfoWindow去加载能显示出来,但是InfoWindow只能加载一条View,这就很蛋疼了,下面这些问题是我很尝试直接, 有绕过,跳过,踩的一些坑....
尝试方法一:使用Glide去加载图片无论是同步还是异步都加载不了(连本地默认图片也无法加载)
尝试方法二:获取图片地址后,单独网络请求后加载图片到地图上,也失败
尝试方法三:获取视图布局后转换成Bitmap去加载,只能加载本地图片,异步加载网络图片也失败
尝试方法四:通过先加载布局到地图上,然后强转为Marker后重新加载图片,也失败
尝试方法五:通过分离控件出来先加载地图,然后再去设置图片也失败
尝试方法六:通过Infowindow去加载,能加载网络图片,但是只能添加一个覆盖物....
百度地图加载自定义Marker View的方式(显示不出来网络图片):
BitmapDescriptor bitmapDescriptor=BitmapDescriptorFactory.
fromView
(View);
MarkerOptions marker=
new
MarkerOptions()
.icon(bitmapDescriptor)
.position(
latLng
);
baiduMap
.addOverlay(marker);
使用InfoWindow方式加载地图,能显示出来网络图片(只能添加一条View):
InfoWindow infoWindow=new InfoWindwo(View,
LatLng,0);
baiduMap.showInfoWindow(infoWindow);
解决方案:
首先,要感谢这
夲仒無道提供个方法把View转换成Bitmap,通过这个方法后能加载本地图片:前提是要在这个方法之前找到设置图片的控件先设置本地图片...
/**
*
把
View
转换成
Bitmap
类型
*
@param
addViewContent
要转换的
View
*
@return
*/
public static
Bitmap getViewBitmap(View addViewContent) {
addViewContent.setDrawingCacheEnabled(
true
);
addViewContent.measure(
View.MeasureSpec.
makeMeasureSpec
(
0
, View.MeasureSpec.
UNSPECIFIED
),
View.MeasureSpec.
makeMeasureSpec
(
0
, View.MeasureSpec.
UNSPECIFIED
));
addViewContent.layout(
0
,
0
,
addViewContent.getMeasuredWidth(),
addViewContent.getMeasuredHeight());
addViewContent.buildDrawingCache();
Bitmap cacheBitmap = addViewContent.getDrawingCache();
Bitmap bitmap = Bitmap.
createBitmap
(cacheBitmap);
return
bitmap;
}
最后的解决方案是这样的:异步加载完成头像后,转换View成Bitmap,再通过
fromBitmap
添加到地图上(这里要注意的是子主线程的问题)
//获取头像布局View
View
personLocView = ViewUtils.
getPersonLoView
(
mContext
, account);
//通过View去找到ImageView控件,这是我自定义圆形头像ImageView
CircleImageView
headAvatar = (
CircleImageView
) personLocView.findViewById(R.id.
iv_avatar
);
/**
*
异步加载头像到地图上
,
原理是把设置好图片
,把View转换成Bitmap
后再添加到地图
,
这样地图才能 显示出头像来
*/
CiatWildHelper.
getInstance
().getUserProfileManager().asyncGetUserInfo(account,
new
EMValueCallBack<EaseUser>() {
@Override
public void
onSuccess(EaseUser user) {
if
(user!=
null
){
if
(!TextUtils.
isEmpty
(user.getAvatar())){//用户头像地址不为空,设置完头像
//把请求到的图片设置到ImageView上,这里设置Glide去加载,这个开源库使用很方便
Glide.
with
(
mContext
).load(user.getAvatar())
.placeholder(R.mipmap.
em_default_avatar
).into(
headAvatar
);
//设置成功后把View转换成Bitmap
Bitmap viewBitmap = ViewUtils.
getViewBitmap
(
personLocView
);
//调用百度地图提供的api获取刚转换的Bitmap
BitmapDescriptor bitmapDescriptor=BitmapDescriptorFactory.
fromBitmap
(viewBitmap);
//构建Marker对象和指定经纬度
MarkerOptions marker=
new
MarkerOptions()
.icon(bitmapDescriptor)
.position(
latLng
);
//添加到地图上
baiduMap
.addOverlay(marker);
}
}
}
@Override
public void
onError(
int
error, String errorMsg) {
Log.
e
(
"asyncFetchUserInfo"
,
"
地图加载头像失败
"
);
}
});