您的位置:首页 > 移动开发 > Android开发

Android 百度地图添加自定义marker(覆盖物)不显示图片的解决方法

2016-11-14 17:12 1281 查看
在使用百度地图添加自定义Marker View时,显示不出来自定义marker view里面的头像,百度地图的添加自定义marker显示网络图片本身就是一个坑(我是这样认为的)...
我的需求是这样的,当有人员上报位置时,就根据经纬度把人员位置信息用自定义Marker去加载请求头像的方式显示出来,添加一个或多个的网络头像时图片显示不出来,如果使用InfoWindow去加载能显示出来,但是InfoWindow只能加载一条View,这就很蛋疼了,下面这些问题是我很尝试直接, 有绕过,跳过,踩的一些坑....

尝试方法一:使用Glide去加载图片无论是同步还是异步都加载不了(连本地默认图片也无法加载)
尝试方法二:获取图片地址后,单独网络请求后加载图片到地图上,也失败
尝试方法三:获取视图布局后转换成Bitmap去加载,只能加载本地图片,异步加载网络图片也失败
尝试方法四:通过先加载布局到地图上,然后强转为Marker后重新加载图片,也失败
尝试方法五:通过分离控件出来先加载地图,然后再去设置图片也失败
尝试方法六:通过Infowindow去加载,能加载网络图片,但是只能添加一个覆盖物....

百度地图加载自定义Marker View的方式(显示不出来网络图片):

BitmapDescriptor bitmapDescriptor=BitmapDescriptorFactory.fromView(View);
MarkerOptions marker=newMarkerOptions()
.icon(bitmapDescriptor)
.position(latLng);
baiduMap.addOverlay(marker);

使用InfoWindow方式加载地图,能显示出来网络图片(只能添加一条View):

InfoWindow infoWindow=new InfoWindwo(View,LatLng,0);
baiduMap.showInfoWindow(infoWindow);

解决方案:

首先,要感谢这夲仒無道提供个方法把View转换成Bitmap,通过这个方法后能加载本地图片:前提是要在这个方法之前找到设置图片的控件先设置本地图片...
详情看他的博客:https://my.oschina.net/freestyletime/blog/291638
 /**
*把View转换成Bitmap类型
*@paramaddViewContent要转换的View
*@return
*/
public staticBitmap 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);

returnbitmap;

}

最后的解决方案是这样的:异步加载完成头像后,转换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 voidonSuccess(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=newMarkerOptions()

.icon(bitmapDescriptor)

.position(latLng);

//添加到地图上

baiduMap.addOverlay(marker);

}

}

}

@Override
public voidonError(interror,
String errorMsg) {

Log.e("asyncFetchUserInfo","地图加载头像失败");

}

});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐