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

徐鑫鹏
2023-12-01
在使用百度地图添加自定义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" , " 地图加载头像失败 " );
}
});



 类似资料: