Android 百度地圖新增自定義marker(覆蓋物)不顯示圖片的解決方法
阿新 • • 發佈:2019-02-10
在使用百度地圖新增自定義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轉換成BitmapBitmap viewBitmap = ViewUtils.getViewBitmap(personLocView);//呼叫百度地圖提供的api獲取剛轉換的BitmapBitmapDescriptor bitmapDescriptor=BitmapDescriptorFactory.fromBitmap(viewBitmap);//構建Marker物件和指定經緯度MarkerOptions marker=newMarkerOptions().icon(bitmapDescriptor).position(latLng);//新增到地圖上baiduMap.addOverlay(marker);}}} @Override public voidonError(interror, String errorMsg) {Log.e("asyncFetchUserInfo","地圖載入頭像失敗");}});