1. 程式人生 > >Android 百度地圖新增自定義marker(覆蓋物)不顯示圖片的解決方法

Android 百度地圖新增自定義marker(覆蓋物)不顯示圖片的解決方法

在使用百度地圖新增自定義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,通過這個方法後能載入本地圖片:前提是要在這個方法之前找到設定圖片的控制元件先設定本地圖片... /** *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","地圖載入頭像失敗");
}
});