在使用百度地图添加自定义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 添加到地图上(这里要注意的是子主线程的问题)//获取头像布局ViewView personLocView = ViewUtils. getPersonLoView ( mContext , account);//通过View去找到ImageView控件,这是我自定义圆形头像ImageViewCircleImageView headAvatar = ( CircleImageView ) personLocView.findViewById(R.id. iv_avatar );/*** 异步加载头像到地图上 , 原理是把设置好图片 ,把View转换成Bitmap 后再添加到地图 , 这样地图才能 显示出头像来*/CiatWildHelper. getInstance ().getUserProfileManager().asyncGetUserInfo(account,new EMValueCallBack<EaseUser>() {@Overridepublic 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转换成BitmapBitmap viewBitmap = ViewUtils. getViewBitmap ( personLocView );
//调用百度地图提供的api获取刚转换的BitmapBitmapDescriptor bitmapDescriptor=BitmapDescriptorFactory. fromBitmap (viewBitmap);//构建Marker对象和指定经纬度MarkerOptions marker= new MarkerOptions().icon(bitmapDescriptor).position( latLng );//添加到地图上baiduMap .addOverlay(marker);}}}
@Overridepublic void onError( int error, String errorMsg) {Log. e ( "asyncFetchUserInfo" , " 地图加载头像失败 " );}});